I’m trying to setup nix-shell
for a simple rails
project. I’ve generated a gemset.nix
file using bundix
and I’m using the following shell.nix
specifying a non-default version of Ruby, i.e. v2.5 vs v2.6.
with (import <nixpkgs> {});
let
env = bundlerEnv {
name = "site-bundler-env";
inherit ruby_2_5;
gemdir = ./.;
};
in stdenv.mkDerivation {
name = "site";
buildInputs = [ env ruby_2_5 ];
}
When I enter the nix-shell, although the correct version of Ruby (v2.5) is made available, it looks as if the gems are installed against the default version of Ruby (i.e. v2.6).
The results of the following commands are as I would expect, i.e. pointing at Ruby v2.5:
$ ruby --version
ruby 2.5.8p224 (2020-03-31) [x86_64-darwin17]
$ which ruby
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/bin/ruby
$ echo $GEM_PATH
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/gems/2.5.0
$ ruby -e 'puts $LOAD_PATH'
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby/2.5.0
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby/2.5.0
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby/2.5.0
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby/2.5.0/x86_64-darwin17
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/site_ruby
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/vendor_ruby/2.5.0
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/vendor_ruby/2.5.0/x86_64-darwin17
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/vendor_ruby
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/2.5.0
/nix/store/2kg3mrk7101ghazdpriacfm8lyqxmq1q-ruby-2.5.8/lib/ruby/2.5.0/x86_64-darwin17
However, the following results surprised me because they are pointing at Ruby v2.6:
$ which bundle
/nix/store/inkl1lx0cp2056yk1ymcg9wr7niliwdp-site-bundler-env/bin/bundle
$ cat `which bundle` | grep GEM_HOME
Gem.paths = { 'GEM_HOME' => "/nix/store/inkl1lx0cp2056yk1ymcg9wr7niliwdp-site-bundler-env/lib/ruby/gems/2.6.0" }
$ cat `which bundle` | grep LOAD_PATH
$LOAD_PATH.unshift "/nix/store/dr1lkwz7q2shjj83nms7jw3g8z1r2vy6-bundler-2.1.4/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib"
And when I try to run the tests (using rake
) or run the server (using rails server
), I see an exception “Your Ruby version is 2.6.6, but your Gemfile specified 2.5.8”:
$ rake
Traceback (most recent call last):
3: from /nix/store/pda1qki1ff40d4yy1jjkzz71204mr8fq-site-bundler-env/bin/rake:18:in `<main>'
2: from /nix/store/dr1lkwz7q2shjj83nms7jw3g8z1r2vy6-bundler-2.1.4/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler.rb:143:in `setup'
1: from /nix/store/dr1lkwz7q2shjj83nms7jw3g8z1r2vy6-bundler-2.1.4/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/definition.rb:470:in `validate_runtime!'
/nix/store/dr1lkwz7q2shjj83nms7jw3g8z1r2vy6-bundler-2.1.4/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/definition.rb:495:in `validate_ruby!': Your Ruby version is 2.6.6, but your Gemfile specified 2.5.8 (Bundler::RubyVersionMismatch)
What am I missing? Is there a way to explicitly specify the version of bundler
used by bundlerEnv
?