Comment utiliser 2 versions de PHP CS Fixer ?

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.

GIT

PHP 7.2 à 8.0

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
Résultat des deux versions installées.

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.

 

Author avatar
Jean-Baptiste Nahan

Consultant Expert Web, j'aide les entreprises ayant des difficultés avec leur projet Web (PHP, Symfony, Sylius).

@jbnahan69 | Macintoshplus | Linkedin | JB Dev Labs