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}