1{ stdenv, lib, buildEnv, buildRubyGem, ruby, gemConfig, makeBinaryWrapper }:
2
3/*
4Example usage:
5nix-shell -E "(import <nixpkgs> {}).ruby.withPackages (pkgs: with pkgs; [ pry nokogiri ])"
6
7You can also use this for writing ruby scripts that run anywhere that has nix
8using a nix-shell shebang:
9 #!/usr/bin/env nix-shell
10 #!nix-shell -i ruby -p "ruby.withPackages (pkgs: with pkgs; [ pry nokogiri ])"
11
12
13Run the following in the nixpkgs root directory to update the ruby-packages.nix:
14./maintainers/scripts/update-ruby-packages
15*/
16
17let
18 functions = import ../bundled-common/functions.nix { inherit lib gemConfig; };
19
20 buildGems = gemset:
21 let
22 realGemset = if builtins.isAttrs gemset then gemset else import gemset;
23 builtGems =
24 lib.mapAttrs (name: initialAttrs:
25 let
26 attrs = functions.applyGemConfigs ({ inherit ruby; gemName = name; } // initialAttrs);
27 in
28 buildRubyGem (functions.composeGemAttrs ruby builtGems name attrs)
29 ) realGemset;
30 in builtGems;
31
32 gems = buildGems (import ../../../top-level/ruby-packages.nix);
33
34 withPackages = selector:
35 let
36 selected = selector gems;
37
38 gemEnv = buildEnv {
39 name = "ruby-gems";
40 paths = selected;
41 pathsToLink = [ "/lib" "/bin" "/nix-support" ];
42 };
43
44 wrappedRuby = stdenv.mkDerivation {
45 name = "wrapped-${ruby.name}";
46 nativeBuildInputs = [ makeBinaryWrapper ];
47 buildCommand = ''
48 mkdir -p $out/bin
49 for i in ${ruby}/bin/*; do
50 makeWrapper "$i" $out/bin/$(basename "$i") --set GEM_PATH ${gemEnv}/${ruby.gemPath}
51 done
52 '';
53 };
54
55 in stdenv.mkDerivation {
56 name = "${ruby.name}-with-packages";
57 nativeBuildInputs = [ makeBinaryWrapper ];
58 buildInputs = [ selected ruby ];
59
60 dontUnpack = true;
61
62 installPhase = ''
63 for i in ${ruby}/bin/* ${gemEnv}/bin/*; do
64 rm -f $out/bin/$(basename "$i")
65 makeWrapper "$i" $out/bin/$(basename "$i") --set GEM_PATH ${gemEnv}/${ruby.gemPath}
66 done
67
68 ln -s ${ruby}/nix-support $out/nix-support
69 '';
70
71 passthru = {
72 inherit wrappedRuby;
73 gems = selected;
74 };
75 };
76
77in { inherit withPackages gems buildGems; }