Exécuter des commandes en utilisant une version Ruby différente à l'aide de rbenv
Lors de la création d’un script pour tester les mises à niveau de la version Ruby dans un système utilisant rbenv
, j’ai remarqué qu’exécuter bundle install
à partir d’un script Ruby utilise la version du script au lieu de celle définie dans le répertoire.
Cela conduit l’installation a échouer avec le tristement célèbre “Your Ruby version is 3.1.2, but your Gemfile specified 3.1.3”.
J’ai testé plusieurs idées qui n’ont pas fonctionné :
- exécuter
rbenv rehash
, séparément ou lors du même appelsystem
- configurer la variable d’environnement
RBENV_VERSION
et/ouRUBY_VERSION
lors de l’exécution de la commande (system({"RBENV_VERSION" => X.Y.Z}, command)
) - modifier les variables d’environnement
RBENV_VERSION
et/ouRUBY_VERSION
avant de lancer la nouvelle commande
Ce qui a finalement fonctionné, avec un impact minimal, a été de préfixer le PATH
avec l’exécutable de la version cible de rbenv
avant d’exécuter bundle install
.
version = "3.1.3"
`rbenv local #{version}`
# Forcer rbenv à utiliser la nouvelle version
ENV["PATH"] = "#{ENV["HOME"]}/.rbenv/versions/#{version}/bin:#{ENV["PATH"]}"
# exécuter des scripts, par exemple :
`bundle install`
# Réinitialiser la variable PATH
ENV["PATH"] = ENV["PATH"].split(":")[1..].join(":")
Remarque : on ne peut pas utiliser prepend
pour modifier ENV["PATH"]
parce que c’est une chaîne figée.