Débogage avec composer

Par nbergeron, 22 février, 2025
Un cafard dans mon écran

J'ai un bogue que je n'arrive pas à régler dans mon projet PHP, que faire ? Abandonner php et rejoindre la clique des détracteurs ou rester à ses côtés et tenter de comprendre ses besoins ?

Dans le contexte d'une application utilisant Composer pour gérer les librairies et des applications associées, eh bien Composer peut vous aider à mieux comprendre votre cher ami PHP ! L'article qui suit proposes quelques façons de s'en sortir dans ce contexte.

Quelques astuces

Une première façon d'avoir des informations pertinentes pour chaque commande est l'option -vvv. Cette option donne tous les détails de ce qui se déroule durant l'exécution d'une commande Composer.

Composer show avec ou sans -v (verbose de base) ou -vv (very verbose)

\W $ composer show -v
dealerdirect/phpcodesniffer-composer-installer 1.0.0  PHP_CodeSniffer Standards Composer Installer Plugin
phpcsstandards/phpcsextra                      1.2.1  A collection of sniffs and standards for use with PHP_CodeSniffer.
phpcsstandards/phpcsutils                      1.0.12 A suite of utility functions for use with PHP_CodeSniffer
squizlabs/php_codesniffer                      3.11.3 PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.
wp-coding-standards/wpcs                       3.1.0  PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions

Composer show avec le mode -vvv (maximum verbosity)

Running 2.8.5 (2025-01-21 15:23:40) with PHP 8.1.31 on Darwin / 24.1.0
Reading ./composer.json (/Users/username/.composer/composer.json)
Loading config file /Users/username/.composer/config.json
Loading config file /Users/username/.composer/auth.json
Loading config file ./composer.json (/Users/username/.composer/composer.json)
Loading config file /Users/username/.composer/auth.json
Reading /Users/username/.composer/auth.json
Checked CA file /opt/homebrew/etc/ca-certificates/cert.pem: valid
Executing command (/Users/username/.composer): 'git' 'branch' '-a' '--no-color' '--no-abbrev' '-v'
Executing command (/Users/username/.composer): 'git' 'describe' '--exact-match' '--tags'
Executing command (CWD): 'git' '--version'
Executing command (/Users/username/.composer): 'git' 'log' '--pretty=%H' '-n1' 'HEAD' '--no-show-signature'
Executing command (/Users/username/.composer): 'hg' 'branch'
Executing command (/Users/username/.composer): 'fossil' 'branch' 'list'
Executing command (/Users/username/.composer): 'fossil' 'tag' 'list'
Executing command (/Users/username/.composer): 'svn' 'info' '--xml'
Reading /Users/username/.composer/vendor/composer/installed.json
Loading plugin PHPCSStandards\Composer\Plugin\Installers\PHPCodeSniffer\Plugin (from dealerdirect/phpcodesniffer-composer-installer, installed globally)
dealerdirect/phpcodesniffer-composer-installer 1.0.0  PHP_CodeSniffer Standards Composer Installer Plugin
phpcsstandards/phpcsextra                      1.2.1  A collection of sniffs and standards for use with PHP_CodeSniffer.
phpcsstandards/phpcsutils                      1.0.12 A suite of utility functions for use with PHP_CodeSniffer
squizlabs/php_codesniffer                      3.11.3 PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.
wp-coding-standards/wpcs                       3.1.0  PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions

Un autre exemple est si vous souhaitez ajouter une librairie à votre projet composer avec composer require.

Sans le niveau maximum de verbosité, voici le message obtenu avec composer require une/librairie :

In PackageDiscoveryTrait.php line 383:                                                                                                                       
  Could not find a matching version of package une/librairie. Check the package spelling, your version constraint and that the package is available in a stability which matches your minimum-stabilit  
  y (stable).   

Avec -vvv voici une information intéressante qui se rajoute :

Reading /Users/username/Library/Caches/composer/repo/https---repo.packagist.org/packages.json from cache
Downloading https://repo.packagist.org/packages.json if modified
[304] https://repo.packagist.org/packages.json
Downloading https://repo.packagist.org/p2/une/librairie.json
[404] https://repo.packagist.org/p2/une/librairie.json
Downloading https://packagist.org/providers/une/librairie.json
[200] https://packagist.org/providers/une/librairie.json
Downloading https://repo.packagist.org/p2/une/librairie~dev.json
[404] https://repo.packagist.org/p2/une/librairie~dev.json
Downloading https://packagist.org/search.json?q=une%2Flibrairie&type=
[200] https://packagist.org/search.json?q=une%2Flibrairie&type=

Les deux messages disent la même chose mais je trouve le deuxième très utile pour les gens qui débutent avec Composer et pour pouvoir identifier s'il y a un problème de réseau ou avec un serveur. Et, en tant que débutant, ça me permet de mieux comprendre ce qui est fait et m'a permis de découvrir le site où on peut explorer différentes librairies disponibles.

L'option Dry run

Cette option permet de lancer une commande sans faire les modifications. Donc, on a un aperçu de ce qu'aurait fait la commande.

Par exemple, si vous avez modifié votre fichier composer.json, alors vous aurez un aperçu de ce qui serait ajouté, enlevé ou mis à jour avec différentes commandes comme composer install, composer update, composer remove ou composer require.

Composer diagnose

Vous aurez un aperçu de la compatibilité de votre installation de composer avec votre environnement ou votre version de php. Voici les résultat que j'ai obtenu. On peut voir notamment que la version de Composer est à jour, que j'ai assez d'espace et que la libraire OpenSSL est récente et bien installée.

\W $ composer diagnose
Checking composer.json: WARNING
No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.
Checking composer.lock: OK
Checking platform settings: OK
Checking git settings: OK git version 2.43.2
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys: FAIL
**Missing pubkey for tags verification**
**Missing pubkey for dev verification**
Run composer self-update --update-keys to set them up
Checking Composer version: OK
Checking Composer and its dependencies for vulnerabilities: OK
Composer version: 2.8.5
PHP version: 8.1.31
PHP binary path: /opt/homebrew/Cellar/php@8.1/8.1.31/bin/php
OpenSSL version: OpenSSL 3.4.0 22 Oct 2024
curl version: 8.11.1 libz 1.2.12 ssl OpenSSL/3.4.0 (SecureTransport)
zip: extension present, unzip present, 7-Zip not available

Cependant, je n'avais pas les clefs publiques pour les vérifications dev et tag. C'est clef sont cruciales car elles permettent de vérifier que j'obtiens des librairies de sources fiables et que la version que j'installe est effectivement celle publiée par la source et que ça n'a pas été modifié par une personne malveillante. Cette sombre réalité m'a fait passer à l'action et j'ai immédiatement rectifié la situation avec la commande composer self-update --update-keys . Cette commande permet de mettre à jour ces clefs. Cette commande est interactive et nous guide dans le processus en nous indiquant le site à visiter pour récupérer les clefs publiques. Je suis allé visiter le site indiqué par la commande et j'ai copié les clefs publiques dans le terminal de commande pour sécuriser...

Open https://composer.github.io/pubkeys.html to find the latest keys
Enter Dev / Snapshot Public Key...

Une fois que c'est fait quand j'ai fait la commande composer diagnose j'ai eu la bonne nouvelle que les clefs publiques sont effectivement bien configurées :

Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0  87719BA6 8F3BB723 4E5D42D0 84A14642
Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B  0C708369 153E328C AD90147D AFE50952

Composer validate

Pour vérifier si l'erreur pourrait venir du fichier composer.json, vous pouvez le valider avec cette commande. Comme vous pouvez voir, il y a quelques erreurs. Ces erreurs concernent l'absence d'informations nécessaires pour pouvoir publier un package avec ce fichier et l'absence de license.

 ./composer.json is valid for simple usage with Composer but has
 strict errors that make it unable to be published as a package
 See https://getcomposer.org/doc/04-schema.md for details on the schema
 #Publish errors
   name : The property name is required
   description : The property description is required
#General warnings
   No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license

Enfin, Composer offre plusieurs commandes et options utiles pour aider à débogguer son projet ! Ce ne sont pas les premières commandes qu'on apprend mais elles mériteraient de l'être pour, à tout le moins, avoir une meilleure compréhension de ce qui se passe sous le capôt de cette belle bagnole lustrée. L'option -vvv se démarque particulièrement selon moi pour comprendre ce qui se passe et avoir des incitatifs à lire la documentation et faire des recherches ciblées dans la documentation à partir des éléments dévoilées.

N'hésitez pas à débloquer la verbosité de votre bon ami Compo qui vous racontera sa journée de travail en long et en large. Il pourrait peut-être vous apprendre quelque chose d'intéressant !

Références

Composer Public Keys Documentation : Composer, "Public Keys", https://composer.github.io/pubkeys.htm (Page consultée le 21 février 2025).

Packagist Repository : Composer, "Packagist Repository", https://repo.packagist.org/ (Page consultée le 21 février 2025).

Étiquettes

Commentaires