Changer rapidement de version php avec homebrew

Une action plutôt commune pour un développeur php est de régulièrement changer la version php de son PATH en jonglant de projet en projet. Cela peut apporter son lot de problèmes : réfléchir à quelle commande exécuter pour changer de version, avoir potentiellement un conflit, gérer les mises à jour de chacune des versions...

Cela fait maintenant plusieurs mois que je me suis concocté une solution alliant simplicité et efficacité (spoiler alert, c'est juste une fonction). J'utilise homebrew comme packages manager, ce qui me permet d'avoir des paquets communs à mes différentes machines sans se préoccuper de l'environnement (MacOS, WSL...).

Mes exigences sont:

  • disposer en simultanéité de plusieurs versions de php, allant de la 5.6 à la dernière version disponible
  • une version doit être rapide à installer (je ne souhaite pas la "build" de mon côté)
  • pouvoir effectuer les mises à jour patch facilement et sans aucune crainte
  • changer de version en une seule commande simple à retenir

Quand nous regardons de plus près les formules brew disponibles, nous voyons effectivement plusieurs versions. Néanmoins, le panel est limité, je n'ai pas de garantie sur les mises à jour de celles-ci et changer de version en une commande peut potentiellement être un casse-tête.

Avec homebrew, il existe un système de taps. Cela permet d'ajouter des répertoires tiers à votre liste de formules. Autrement dit, pouvoir installer et mettre à jour des paquets non disponibles via la commande brew install <paquet>. Si vous connaissez le gestionnaire de paquets apt, ce serait un équivalent à add-apt-repository ppa:<paquet>.

Après quelques recherches, je suis tombé sur shivammathur/homebrew-php, un tap homebrew entièrement automatisé. Au moment où j'écris cet article, les versions prises en compte vont de la 5.6 à la 8.2.0-dev. Il suffit donc, comme le README.md l'indique, d'ajouter le tap à son local avec la commande brew tap shivammathur/php. Cela permet simplement de rendre de nouvelles formules disponibles.

Maintenant il est possible d'installer n'importe quelle version disponible souhaitée avec brew install shivammathur/php/php@<version>. Les mises à jour se feront comme n'importe quel autre paquet avec brew update et brew upgrade. Et comme tout est automatisé, elles sont disponibles très rapidement après la sortie d'une nouvelle version patch.

brew "shivammathur/php/php" # or brew "shivammathur/php/php@8.1"
brew "shivammathur/php/php@8.0"
brew "shivammathur/php/php@7.4"

Ici j'installe donc la dernière version en date (8.1 actuellement) ainsi que les versions 8.0 et 7.4. Il est bon de noter que dans ce cas là, shivammathur/php/php@8.1 est un alias pour shivammathur/php/php. Le paquet n'est pas dupliqué.

Je dispose de plusieurs versions mais basculer entre chacune d'entre elle reste fastidieux. Pour aller sur la 8.0 ou la 7.4 la commande est brew link --overwrite --force shivammathur/php/php@<7.4 ou 8.0> tandis que pour la formule "sans version" (correspondant à la dernière en date) il faut utiliser brew unlink php && brew link php. Avec une simple fonction bash disponible dans votre PATH, on peut éviter le fardeau de retenir ces commandes et surtout éviter les erreurs.

changephp() {
  if [[ -n "$1" ]]; then
    if ! brew link --overwrite --force shivammathur/php/php@"$1"; then
      brew install shivammathur/php/php@"$1"
      brew link --overwrite --force shivammathur/php/php@"$1"
    fi
  else
    if ! (brew unlink php && brew link php); then
      brew install shivammathur/php/php
    fi
  fi
}

Désormais, si je souhaite basculer sur la dernière version je peux exécuter changephp et pour une autre version comme la 7.4, changephp 7.4. Cerise sur la gâteau, si la version n'est pas installée, elle le sera automatiquement.

Seul point de vigilance, la formule shivammathur/php/php peut augmenter de version php si vous la mettez à jour et qu'entre temps une nouvelle version de php mineure ou majeure est sortie. Vous devrez donc ajouter la formule correspondant à votre ancienne version.

Simple, rapide et efficace !