Comment utiliser 2 versions de PHP CS Fixer ?

Table des matières
Cette procédure est spécifique à l'usage de 2 versions en même temps sur votre ordinateur. Une version plus simple existe si vous n'avez besoin que d'une seule version.
Comment utiliser deux versions de PHP CS Fixer en même temps sur votre ordinateur ? Comment utiliser la bonne version de PHP CS Fixer automatiquement ?
En tant que consultant, j'interviens sur différents projets et il est difficile de migrer les outils pour tous les projets (dans toutes les équipes) en même temps.
L'année dernière (et oui déjà) j'ai parler de la meilleur méthode pour ne plus penser à PHP CS Fixer. Cette année je vous propose une mise à jour pour prendre en charge PHP CS Fixer version 2 et la version 3 qui est sortie début 2021.
Pourquoi utiliser PHP CS Fixer ?
PHP CS Fixer est un outil permettant de vérifier et corriger le formatage du code PHP selon le code style défini dans la configuration du projet (fichier .php_cs.dist
ou .php_cs
pour la version 2 et .php-cs-fixer.dist.php
ou .php-cs-fixer.php
pour la version 3).
Le style code est une convention qui définit comment doit être écrit le code. Par exemple l'emplacement des accolades des structures de contrôle, des classes, des fonctions, les espaces autour d'un signe égal, etc.
Cela permet de faciliter la lecture du code pour tout le monde.
Le PHP-FIG a défini plusieurs conventions dont la dernière en date est la PSR-12. Il existe également des conventions plus spécifiques comme le Coding Standards de Symfony.
En plus du formatage du code, il permet également d'optimiser (remplacer count
par \count
pour de meilleurs performances) et d'unifier certain usage (ex: transformer l'utilisation de la fonction array
en crochet).
Durée estimée : 10 minutes
Outils nécessaires
Pour suivre ce tutoriel, vous avez besoin que ces outils soit installé sur votre ordinateur.
Installer les deux versions de PHP CS Fixer
Installer la version 3 selon la procédure décrite dans la documentation et la version 2 de la même façon en suffixant le fichier par le chiffre 2.
Pour cela, je vais installer PHP CS Fixer v2 et v3 sur mon ordinateur. J'utilise toujours la procédure d'installation globale décrite dans la documentation avec une petite nuance pour la version 2.
$ wget https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v2.19.3/php-cs-fixer.phar -O php-cs-fixer2
Ou si vous préférez avec cURL :
$ curl -L https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v2.19.3/php-cs-fixer.phar -o php-cs-fixer2
Le reste de la procédure est la même que celle décrite dans la procédure d'installation (pensez à ajouter le 2 à la fin du nom pour chaque commande).
Pour vérifier le bon fonctionnement, exécuter les commandes
$ /usr/local/bin/php-cs-fixer --version
$ /usr/local/bin/php-cs-fixer2 --version

Git Hook pre-commit
Ajouter le script de pre-commit à votre projet.
Contrairement à la première version, le script du hook pre-commit est plus conséquent. Il se place dans le dossier .git/hooks/
de votre projet sous le nom pre-commit
. N'oubliez pas d'affecter les droits d'exécution au fichier avec la commande : chmod u+x .git/hooks/pre-commit
.
Voici son contenu :
#!/bin/sh
ROOT=$(dirname "$0")
ROOT=$(dirname "$ROOT")
ROOT=$(dirname "$ROOT")
echo "php-cs-fixer pre commit hook start"
HAS_PHP_CS_FIXER=false
PHP_CS_FIXER_LOCATIONS="/usr/local/bin/php-cs-fixer /usr/local/bin/php-cs-fixer2 $ROOT/php-cs-fixer.phar"
for path in $PHP_CS_FIXER_LOCATIONS
do
echo "Check PHP CS Fixer path $path"
if [ -x "$path" ]; then
$path --version 2> /dev/null | grep " 2\." > /dev/null
result=$?
if [ $result -eq 0 ]; then
PHP_CS_V2=$path
continue
fi
$path --version 2> /dev/null | grep " 3\." > /dev/null
result=$?
if [ $result -eq 0 ]; then
PHP_CS_V3=$path
fi
fi
done
if [ "x$PHP_CS_V2" = "x" ] && [ "x$PHP_CS_V3" = "x" ]; then
echo "Unable to locate PHP Cs Fixer v2 or v3"
fi
for file in .php_cs.dist .php_cs
do
if [ -f "$ROOT/$file" ]; then
echo PHP CS Fixer v2 config file found in projet at $file
PHP_CS_CONFIG_V2=$file
fi
done
for file in .php-cs-fixer.dist.php .php-cs-fixer.php
do
if [ -f "$ROOT/$file" ]; then
echo PHP CS Fixer v3 config file found in projet at $file
PHP_CS_CONFIG_V3=$file
fi
done
if [ "x$PHP_CS_CONFIG_V2" != "x" ] && [ "x$PHP_CS_CONFIG_V3" != "x" ]; then
echo "PHP CS Fixer v2 AND v3 config file found ! Please remove one."
fi
if [ "x$PHP_CS_CONFIG_V2" = "x" ] && [ "x$PHP_CS_CONFIG_V3" = "x" ]; then
echo "No PHP CS Fixer v2 OR v3 config file found ! Please set one."
fi
if [ "x$PHP_CS_CONFIG_V2" != "x" ] && [ "x$PHP_CS_V2" != "x" ]; then
PHP_CS_CONFIG=$PHP_CS_CONFIG_V2
PHP_CS_FIXER=$PHP_CS_V2
HAS_PHP_CS_FIXER=true
fi
if [ "x$PHP_CS_CONFIG_V3" != "x" ] && [ "x$PHP_CS_V3" != "x" ]; then
PHP_CS_CONFIG=$PHP_CS_CONFIG_V3
PHP_CS_FIXER=$PHP_CS_V3
HAS_PHP_CS_FIXER=true
fi
if $HAS_PHP_CS_FIXER; then
git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | while read line; do
$PHP_CS_FIXER fix --config=$ROOT/$PHP_CS_CONFIG --verbose "$line";
git add "$line";
done
else
echo ""
echo "Unable to run PHP CS Fixer. Please install php-cs-fixer, see:"
echo ""
echo " https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/master/doc/installation.rst#globally-manual"
echo ""
fi
echo "php-cs-fixer pre commit hook finish"
La première étape est la recherche de PHP CS Fixer et de sa version. La deuxième est la recherche de la configuration pour la version 2 ou 3. Votre projet ne doit en avoir qu'une seule configuration.
Pour finir, il exécute le PHP CS Fixer sur les fichiers PHP présent dans le commit en cours.
Mettre à jour le template GIT
Enregistrer le fichier script de hook dans le dossier du template de dépôt GIT. Il sera utilisé comme source pour la mise à jour des dépôts.
Maintenant que le hook est en place et fonctionne, nous pouvons le placer dans le template des dépôt GIT avec la commande : cp .git/hooks/pre-commit ~/.git-templates/hooks/
(vous devez être dans le dossier du projet utilisé à l'étape précédente).
Si le fichier existe déjà, écrasez le. Si le dossier .git-templates n'existe pas, exécuter les commandes suivante pour configurer GIT et créer le dossier:
git config --global init.templatedir '~/.git-templates'
mkdir -p ~/.git-templates/hooks
Cette fois, nous allons nous assurer que tout le monde peut l'exécuter avec cette commande : chmod a+x ~/.git-templates/hooks/pre-commit
.
Installer (ou mettre à jour) le hook sur un dépôt existant
Si vous avez déjà un hook sur le dépôt, vous devez le supprimer. Dans tous les cas exécuter la commande "git init".
Pour savoir si votre projet a déjà un hook, ouvez un terminal et placer vous dans le dossier du projet.
Exécuter la commande ls -l .git/hooks/pre-commit
Si vous avez les informations du fichier qui s'affiche, vous devez le supprimer avec la commande rm .git/hooks/pre-commit
Maintenant, la procédure est la même pour tout le monde. Exécuter la commande git init
pour installer le hook.
PHP CS Fixer est exécuté sur chaque fichier modifié pour corriger le style code avant le commit.
Allez plus loin en ajoutant un fichier de configuration GIT pour ignorer globalement certain fichier.