Run commands using a different ruby version using rbenv
While building a script to test ruby version upgrades in a rbenv-enabled system, I noticed that running bundle install from within a ruby script uses the script’s version of ruby instead of the one defined in the directory.
In particular, bundle install failed with the infamous Your Ruby version is 3.1.2, but your Gemfile specified 3.1.3.
I tested several ideas that didn’t work:
- running
rbenv rehash, separately or from the samesystemcall - setting
RBENV_VERSIONand/orRUBY_VERSIONwhile executing the command:system({"RBENV_VERSION" => X.Y.Z}, command) - setting
RBENV_VERSIONand/orRUBY_VERSIONbefore launching the new command
What finally worked, with the minimum impact, was to prepend the PATH with rbenv’s target version executable before running bundle install.
version = "3.1.3"
`rbenv local #{version}`
# Force rbenv to use the new version
ENV["PATH"] = "#{ENV["HOME"]}/.rbenv/versions/#{version}/bin:#{ENV["PATH"]}"
# run scripts, for instance:
`bundle install`
# Reset PATH
ENV["PATH"] = ENV["PATH"].split(":")[1..].join(":")
Side-note: we can’t use prepend to change ENV["PATH"] because it is frozen.