Composer : Conseils d'utilisation

Composer est un outil de gestion des dépendances en PHP. Il nous permet de lister les bibliothèques dont notre projet dépend, et il les installera et les mettra à jour pour nous. Nous allons montrer :

  • comment installer Composer
  • son utilisation dans un projet nouveau ou existant

Installation

Composer est un fichier .phar exécutable que vous téléchargez et installez de la manière suivante :

Windows

Utilisez l'installeur officiel Composer-Setup.exe.

Linux, macOS

Il suffit de 4 commandes que vous copiez depuis cette page.

Ensuite, en le plaçant dans un dossier qui se trouve dans le PATH système, Composer devient accessible globalement :

$ mv ./composer.phar ~/bin/composer # ou /usr/local/bin/composer

Utilisation dans un projet

Pour pouvoir commencer à utiliser Composer dans votre projet, vous n'avez besoin que du fichier composer.json. Celui-ci décrit les dépendances de notre projet et peut également contenir d'autres métadonnées. Un composer.json de base peut donc ressembler à ceci :

{
	"require": {
		"nette/database": "^3.0"
	}
}

Nous indiquons ici que notre application (ou bibliothèque) nécessite le paquet nette/database (le nom du paquet se compose du nom de l'organisation et du nom du projet) et veut une version qui correspond à la contrainte ^3.0 (c'est-à-dire la dernière version 3).

Nous avons donc à la racine du projet le fichier composer.json et nous lançons l'installation :

composer update

Composer téléchargera Nette Database dans le dossier vendor/. Il créera également le fichier composer.lock, qui contient des informations sur les versions exactes des bibliothèques qu'il a installées.

Composer génère le fichier vendor/autoload.php, que nous pouvons simplement inclure et commencer à utiliser les bibliothèques sans aucun travail supplémentaire :

require __DIR__ . '/vendor/autoload.php';

$db = new Nette\Database\Connection('sqlite::memory:');

Mise à jour des paquets vers les dernières versions

La mise à jour des bibliothèques utilisées vers les dernières versions selon les contraintes définies dans composer.json est gérée par la commande composer update. Par exemple, pour la dépendance "nette/database": "^3.0", il installera la dernière version 3.x.x, mais pas la version 4.

Pour mettre à jour les contraintes dans le fichier composer.json, par exemple vers "nette/database": "^4.1", afin de pouvoir installer la dernière version, utilisez la commande composer require nette/database.

Pour mettre à jour tous les paquets Nette utilisés, il faudrait tous les lister dans la ligne de commande, par ex. :

composer require nette/application nette/forms latte/latte tracy/tracy ...

Ce qui n'est pas pratique. Utilisez donc le script simple Composer Frontline, qui le fera pour vous :

php composer-frontline.php

Création d'un nouveau projet

Vous créez un nouveau projet Nette à l'aide d'une seule commande :

composer create-project nette/web-project nom-du-projet

Comme nom-du-projet, insérez le nom du répertoire pour votre projet et confirmez. Composer téléchargera le dépôt nette/web-project depuis GitHub, qui contient déjà le fichier composer.json, puis Nette Framework. Il devrait suffire de définir les permissions d'écriture sur les dossiers temp/ et log/ et le projet devrait prendre vie.

Si vous savez sur quelle version de PHP le projet sera hébergé, n'oubliez pas de la définir.

Version de PHP

Composer installe toujours les versions de paquets compatibles avec la version de PHP que vous utilisez actuellement (plus précisément, avec la version de PHP utilisée dans la ligne de commande lors de l'exécution de Composer). Ce qui n'est probablement pas la même version que celle utilisée par votre hébergement. C'est pourquoi il est très important d'ajouter au fichier composer.json l'information sur la version de PHP sur l'hébergement. Ensuite, seules les versions de paquets compatibles avec l'hébergement seront installées.

Le fait que le projet fonctionnera par exemple sur PHP 8.2.3 est défini par la commande :

composer config platform.php 8.2.3

La version est ainsi écrite dans le fichier composer.json :

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

Cependant, le numéro de version de PHP est indiqué à un autre endroit du fichier, dans la section require. Alors que le premier numéro détermine pour quelle version les paquets seront installés, le second numéro indique pour quelle version l'application elle-même est écrite. Et selon lui, par exemple, PhpStorm définit le niveau de langage PHP. (Bien sûr, il n'est pas logique que ces versions diffèrent, donc la double écriture est une imperfection.) Vous définissez cette version avec la commande :

composer require php 8.2.3 --no-update

Ou directement dans le fichier composer.json :

{
	"require": {
		"php": "8.2.3"
	}
}

Ignorer la version de PHP

Les paquets indiquent généralement à la fois la version minimale de PHP avec laquelle ils sont compatibles et la version maximale avec laquelle ils sont testés. Si vous prévoyez d'utiliser une version de PHP encore plus récente, par exemple à des fins de test, Composer refusera d'installer un tel paquet. La solution est l'option --ignore-platform-req=php+, qui fait que Composer ignorera les limites supérieures de la version de PHP requise.

Faux rapports

Lors de la mise à niveau des paquets ou des changements de numéros de version, il arrive qu'un conflit se produise. Un paquet a des exigences qui sont en conflit avec un autre, etc. Mais Composer affiche parfois un faux rapport. Il signale un conflit qui n'existe pas réellement. Dans ce cas, il est utile de supprimer le fichier composer.lock et de réessayer.

Si le message d'erreur persiste, alors il est sérieux et il faut en déduire quoi et comment modifier.

Packagist.org – dépôt central

Packagist est le dépôt principal dans lequel Composer essaie de rechercher des paquets, sauf indication contraire. Nous pouvons y publier nos propres paquets.

Et si nous ne voulons pas utiliser le dépôt central ?

Si nous avons des applications internes à l'entreprise que nous ne pouvons tout simplement pas héberger publiquement, nous créons pour elles un dépôt d'entreprise.

Plus d'informations sur le sujet des dépôts dans la documentation officielle.

Autoloading

Une caractéristique essentielle de Composer est qu'il fournit l'autoloading pour toutes les classes qu'il a installées, que vous démarrez en incluant le fichier vendor/autoload.php.

Cependant, il est possible d'utiliser Composer également pour charger d'autres classes en dehors du dossier vendor. La première option est de laisser Composer parcourir les dossiers et sous-dossiers définis, trouver toutes les classes et les inclure dans l'autoloader. Vous obtenez cela en définissant autoload > classmap dans composer.json :

{
	"autoload": {
		"classmap": [
			"src/",      #  inclut le dossier src/ et ses sous-dossiers
		]
	}
}

Ensuite, il est nécessaire, à chaque modification, d'exécuter la commande composer dumpautoload et de laisser les tables d'autoloading se régénérer. C'est extrêmement inconfortable et il est bien préférable de confier cette tâche à RobotLoader, qui effectue la même activité automatiquement en arrière-plan et beaucoup plus rapidement.

La deuxième option est de respecter PSR-4. En termes simples, c'est un système où les espaces de noms et les noms de classes correspondent à la structure des répertoires et aux noms de fichiers, donc par ex. App\Core\RouterFactory sera dans le fichier /chemin/vers/App/Core/RouterFactory.php. Exemple de configuration :

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # l'espace de noms App\ est dans le répertoire app/
		}
	}
}

Comment configurer précisément le comportement est expliqué dans la documentation de Composer.

Test de nouvelles versions

Vous voulez tester une nouvelle version de développement d'un paquet. Comment faire ? Tout d'abord, ajoutez cette paire d'options au fichier composer.json, qui permettra d'installer les versions de développement des paquets, mais n'y recourra que s'il n'existe aucune combinaison de versions stables qui satisferait aux exigences :

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

Ensuite, nous recommandons de supprimer le fichier composer.lock, parfois Composer refuse inexplicablement l'installation et cela résout le problème.

Supposons qu'il s'agisse du paquet nette/utils et que la nouvelle version porte le numéro 4.0. Vous l'installez avec la commande :

composer require nette/utils:4.0.x-dev

Ou vous pouvez installer une version spécifique, par exemple 4.0.0-RC2 :

composer require nette/utils:4.0.0-RC2

Mais si un autre paquet dépend de la bibliothèque et est verrouillé sur une version plus ancienne (par ex. ^3.1), alors il est idéal de mettre à jour le paquet pour qu'il fonctionne avec la nouvelle version. Cependant, si vous voulez simplement contourner la restriction et forcer Composer à installer la version de développement et prétendre qu'il s'agit d'une version plus ancienne (par ex. 3.1.6), vous pouvez utiliser le mot-clé as :

composer require nette/utils "4.0.x-dev as 3.1.6"

Appel de commandes

Via Composer, il est possible d'appeler des commandes et des scripts personnalisés prédéfinis, comme s'il s'agissait de commandes natives de Composer. Pour les scripts qui se trouvent dans le dossier vendor/bin, il n'est pas nécessaire de spécifier ce dossier.

Comme exemple, définissons dans le fichier composer.json un script qui utilise Nette Tester pour lancer les tests :

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

Nous lançons ensuite les tests à l'aide de composer tester. Nous pouvons appeler la commande même si nous ne sommes pas dans le dossier racine du projet, mais dans l'un des sous-répertoires.

Envoyez un merci

Nous allons vous montrer une astuce qui fera plaisir aux auteurs open source. Vous pouvez facilement donner une étoile sur GitHub aux bibliothèques que votre projet utilise. Il suffit d'installer la bibliothèque symfony/thanks :

composer global require symfony/thanks

Et ensuite exécuter :

composer thanks

Essayez !

Configuration

Composer est étroitement lié à l'outil de versionnement Git. Si vous ne l'avez pas installé, il faut dire à Composer de ne pas l'utiliser :

composer -g config preferred-install dist