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.

Tags : Ruby rbenv

Publié le 27 août 2023

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 appel system
  • configurer la variable d’environnement RBENV_VERSION et/ou RUBY_VERSION lors de l’exécution de la commande (system({"RBENV_VERSION" => X.Y.Z}, command))
  • modifier les variables d’environnement RBENV_VERSION et/ou RUBY_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.