forked from mirrors/nixpkgs
1f49035aca
Co-authored-by: Alyssa Ross <hi@alyssa.is>
76 lines
2.2 KiB
Nix
76 lines
2.2 KiB
Nix
{ stdenv, lib, buildEnv, buildRubyGem, ruby, gemConfig, makeWrapper }:
|
|
|
|
/*
|
|
Example usage:
|
|
nix-shell -E "(import <nixpkgs> {}).ruby.withPackages (pkgs: with pkgs; [ pry nokogiri ])"
|
|
|
|
You can also use this for writing ruby scripts that run anywhere that has nix
|
|
using a nix-shell shebang:
|
|
#!/usr/bin/env nix-shell
|
|
#!nix-shell -i ruby -p "ruby.withPackages (pkgs: with pkgs; [ pry nokogiri ])"
|
|
|
|
|
|
Run the following in the nixpkgs root directory to update the ruby-packages.nix:
|
|
./maintainers/scripts/update-ruby-packages
|
|
*/
|
|
|
|
let
|
|
functions = import ../bundled-common/functions.nix { inherit lib gemConfig; };
|
|
|
|
buildGems = gemset:
|
|
let
|
|
realGemset = if builtins.isAttrs gemset then gemset else import gemset;
|
|
builtGems =
|
|
lib.mapAttrs (name: initialAttrs:
|
|
let
|
|
attrs = functions.applyGemConfigs ({ inherit ruby; gemName = name; } // initialAttrs);
|
|
in
|
|
buildRubyGem (functions.composeGemAttrs ruby builtGems name attrs)
|
|
) realGemset;
|
|
in builtGems;
|
|
|
|
gems = buildGems (import ../../../top-level/ruby-packages.nix);
|
|
|
|
withPackages = selector:
|
|
let
|
|
selected = selector gems;
|
|
|
|
gemEnv = buildEnv {
|
|
name = "ruby-gems";
|
|
paths = selected;
|
|
pathsToLink = [ "/lib" "/bin" "/nix-support" ];
|
|
};
|
|
|
|
wrappedRuby = stdenv.mkDerivation {
|
|
name = "wrapped-${ruby.name}";
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
buildCommand = ''
|
|
mkdir -p $out/bin
|
|
for i in ${ruby}/bin/*; do
|
|
makeWrapper "$i" $out/bin/$(basename "$i") --set GEM_PATH ${gemEnv}/${ruby.gemPath}
|
|
done
|
|
'';
|
|
};
|
|
|
|
in stdenv.mkDerivation {
|
|
name = "${ruby.name}-with-packages";
|
|
nativeBuildInputs = [ makeWrapper ];
|
|
buildInputs = [ selected ruby ];
|
|
|
|
unpackPhase = ":";
|
|
|
|
installPhase = ''
|
|
for i in ${ruby}/bin/* ${gemEnv}/bin/*; do
|
|
rm -f $out/bin/$(basename "$i")
|
|
makeWrapper "$i" $out/bin/$(basename "$i") --set GEM_PATH ${gemEnv}/${ruby.gemPath}
|
|
done
|
|
'';
|
|
|
|
passthru = {
|
|
inherit wrappedRuby;
|
|
gems = selected;
|
|
};
|
|
};
|
|
|
|
in { inherit withPackages gems buildGems; }
|