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