547b5b7a73
This fixes nix-shell -p 'ruby.withPackages (const [])' ruby.devdoc which otherwise wouldn't find documentation, unlike nix-shell -p ruby ruby.devdoc which would, because ruby has setup hooks to accomodate for this, that were being masked by the withPackages wrapper.
77 lines
2.2 KiB
Nix
77 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
|
|
|
|
ln -s ${ruby}/nix-support $out/nix-support
|
|
'';
|
|
|
|
passthru = {
|
|
inherit wrappedRuby;
|
|
gems = selected;
|
|
};
|
|
};
|
|
|
|
in { inherit withPackages gems buildGems; }
|