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.
78 lines
2.2 KiB
Nix
78 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; }
|