Programmation PHP/Composer
Composer est un logiciel de gestion des bibliothèques PHP open source. Celles-ci sont aussi accessibles sur https://packagist.org/.
Installation
modifierPour l'installer il y a trois solutions :
- Avec les commandes PHP décrites sur https://getcomposer.org/download/.
- En téléchargeant le package par navigateur à la même adresse.
- En le téléchargeant avec la commande cURL[1], comme le montre la vidéo suivante :
À la fin il faut juste disposer du fichier composer.phar.
Pour le lancer, on peut utiliser la commande composer
s'il est installé avec PHP, ou php composer.phar
s'il est juste téléchargé.
Pour l'installer à partir du téléchargement :
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
Enfin, pour tester l'installation, lancer :
composer -v
Utilisation
modifierLe programme Composer lit et modifie la liste des bibliothèques du projet dans le fichier composer.json.
init
modifierPour créer le fichier composer.json :
composer init
create-project
modifierAlternative à init pour les apps initialisée par un framework.
composer create-project "symfony/skeleton:^5" mon_projet
require
modifierPour installer un paquet, par exemple client client HTTP Guzzle :
composer guzzlehttp/guzzle
Si l'installation réussit, il ajoute le nom et la version du paquet dans composer.json, ceux de ses dépendances dans composer.lock, et télécharge leurs fichiers dans un dossier "vendors". Il informe ensuite des problèmes de dépendances, par exemple si la version de PHP locale est inférieure à celle recommandée pour le paquet. En cas d'erreur il retire tout ce qu'il a fait.
Paramètres
modifierOn peut aussi préciser le numéro de version, par exemple MediaWiki :
composer require mediawiki/semantic-media-wiki "1.9.*,>=1.9.0.1"
On peut aussi installer plusieurs paquets à la suite :
composer require symfony/framework-bundle symfony/console
Pour éviter de télécharger une bibliothèque destinée au développement en environnement de production, l'ajouter en mode "dev", puis lancer composer install
en développement, et composer install --no-dev
en production :
composer require --dev phpunit/phpunit ^8
Pour utiliser une branche du dépôt de la dépendance, , utiliser le mot réservé ":dev-" suivi de son nom. Ex :
composer require mediawiki/semantic-media-wiki:dev-123_ma_branche
Pour utiliser un commit particulier du dépôt de la dépendance, utiliser le mot réservé "dev-master". Ex :
composer require mediawiki/semantic-media-wiki dev-master#hash_du_commit
install
modifierGénéralement quand on clone un projet git existant contenant un composer.json, il suffit ensuite pour le faire fonctionner, d'installer ses dépendances ainsi :
composer install
Si plusieurs versions de PHP sont installées, il faut préciser laquelle exécute composer ainsi :
/usr/bin/php8.2 /usr/local/bin/composer install
update
modifier
Ne jamais lancer de composer update
sur un projet existant, sous peine de devoir tout retester. En effet, mieux vaut ne mettre à jour qu'une seule bibliothèque en précisant son nom :
php composer.phar update mediawiki/semantic-media-wiki --with-dependencies
Il faut parfois éditer le composer.json avec la règle de la nouvelle version souhaitée avant de lancer l'update.
show
modifierAffiche toutes les bibliothèques installées sur une ligne chacune, ce qui est plus lisible que composer.lock.
depends
modifierAffiche les bibliothèques qui dépendent du package donné en paramètre.
clear-cache
modifier composer clear-cache
Syntaxe du composer.json
modifierLa syntaxe JSON de ce fichier contient quelques extensions[2] :
name
modifierLe nom de l'application, telle qu'elle sera appelée par composer.
Il existe une syntaxe pour le nommage des bibliothèques sous peine de warnings lors des manipulations avec composer. Elles doivent être de la forme vendor name/package name, uniquement avec des caractères alphanumériques plus "-", "." ou "_".
require
modifierLe paragraphe "require" contient les noms des dépendances ainsi que leurs numéros de version (SemVer).
Symbole | Rôle (placé avant un numéro de version) | Exemple |
---|---|---|
>= | permet d'en étendre le numéro. De même on trouve les symboles >, <, <=. | "php": ">=5.5.9" inclut PHP 7.
|
!= | exclut une version. | |
- | définit une plage de versions. | |
¦¦ | ajoute des versions possibles. | "symfony/symfony": "2.8 ¦¦ 3.0" regroupe uniquement ces deux versions.
|
* | étend à toutes les sous-versions. | "symfony/symfony": "3.1.*" comprend la 3.1.1.
|
~ | étend aux versions suivantes du même niveau. | "doctrine/orm": "~2.5" concerne aussi la 2.6 mais pas la 2.4 ni la 3.0.
|
^ | fait la même chose que tilde sous réserve qu'il y ait une compatibilité ascendante. |
Stability Flag
modifierAprès la version à trois nombres, on peut suffixer un arobase puis un Stability Flag[3]. Exemples :
@dev
@stable
require-dev
modifierOn y trouve ce qui a été installé avec require --dev
, donc généralement des bibliothèques de tests et d'analyse de code.
config
modifierEnsemble de paramètres de composer[4], par exemple le timeout ou les identifiants vers certains dépôts.
autoload
modifierMapping des namespaces vers les classes. Cela permet de plus d'inclure tous les fichiers des dossiers automatiquement (et donc d'éviter les fonctions require()
et include()
)[5].
Exemple :
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
De plus, un mapping spécifique aux environnements dev est possible avec :
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
scripts
modifierScripts qui s’exécutent quand on lance "composer"[6].
- Soit automatiquement si présents dans "auto-scripts".
- Soit manuellement. Exemple avec Doctrine dans Symfony :
...
"scripts": {
"doctrine-cc": "php bin/console doctrine:cache:clear-metadata && php bin/console doctrine:cache:clear-query && php bin/console doctrine:cache:clear-result"
},
...
Utilisation :
composer doctrine-cc
extra
modifierComplément de "scripts".
conflict
modifierListe automatiquement les dépendances en conflit, c'est-à-dire qui ne peuvent pas être installées avec l'application courante dans une tierce.
repositories
modifierPour spécifier des dépôts privés (qui ne sont pas accessibles sans communiquer leur URL).
Exemple complet
modifierExemple de mediawiki/core[7] :
{
"name": "mediawiki/core",
"description": "Free software wiki application developed by the Wikimedia Foundation and others",
"type": "mediawiki-core",
"keywords": [
"mediawiki",
"wiki"
],
"homepage": "https://www.mediawiki.org/",
"authors": [
{
"name": "MediaWiki Community",
"homepage": "https://www.mediawiki.org/wiki/Special:Version/Credits"
}
],
"license": "GPL-2.0-or-later",
"support": {
"issues": "https://bugs.mediawiki.org/",
"irc": "irc://irc.libera.chat/mediawiki",
"wiki": "https://www.mediawiki.org/"
},
"prefer-stable": true,
"require": {
"composer/semver": "3.2.4",
"cssjanus/cssjanus": "2.0.0",
"ext-ctype": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlreader": "*",
"guzzlehttp/guzzle": "7.2.0",
"liuggio/statsd-php-client": "1.0.18",
"monolog/monolog": "2.2.0",
"oojs/oojs-ui": "0.42.0",
"pear/mail": "1.4.1",
"pear/mail_mime": "1.10.9",
"pear/net_smtp": "1.9.2",
"php": ">=7.2.22",
"psr/container": "1.1.1",
"psr/log": "1.1.3",
"ralouphie/getallheaders": "3.0.3",
"wikimedia/assert": "0.5.0",
"wikimedia/at-ease": "2.1.0",
"wikimedia/base-convert": "2.0.1",
"wikimedia/cdb": "1.4.1",
"wikimedia/cldr-plural-rule-parser": "2.0.0",
"wikimedia/common-passwords": "0.3.0",
"wikimedia/composer-merge-plugin": "2.0.1",
"wikimedia/html-formatter": "3.0.1",
"wikimedia/ip-set": "3.0.0",
"wikimedia/ip-utils": "3.0.2",
"wikimedia/less.php": "3.1.0",
"wikimedia/minify": "2.2.4",
"wikimedia/normalized-exception": "1.0.1",
"wikimedia/object-factory": "3.0.2",
"wikimedia/parsoid": "^0.14.0-a14@alpha",
"wikimedia/php-session-serializer": "2.0.0",
"wikimedia/purtle": "1.0.7",
"wikimedia/relpath": "3.0.0",
"wikimedia/remex-html": "2.3.2",
"wikimedia/request-timeout": "1.1.0",
"wikimedia/running-stat": "1.2.1",
"wikimedia/scoped-callback": "3.0.0",
"wikimedia/services": "2.0.1",
"wikimedia/shellbox": "2.0.0",
"wikimedia/utfnormal": "3.0.2",
"wikimedia/timestamp": "3.0.0",
"wikimedia/wait-condition-loop": "2.0.2",
"wikimedia/wrappedstring": "3.2.0",
"wikimedia/xmp-reader": "0.8.1",
"zordius/lightncandy": "1.2.5"
},
"require-dev": {
"composer/spdx-licenses": "1.5.4",
"doctrine/dbal": "2.10.4||3.0.0",
"doctrine/sql-formatter": "1.1.1",
"giorgiosironi/eris": "^0.10.0",
"hamcrest/hamcrest-php": "^2.0",
"johnkary/phpunit-speedtrap": "^3.1",
"justinrainbow/json-schema": "~5.2",
"mediawiki/mediawiki-codesniffer": "37.0.0",
"mediawiki/mediawiki-phan-config": "0.10.6",
"nikic/php-parser": "4.10.2",
"nmred/kafka-php": "0.1.5",
"php-parallel-lint/php-console-highlighter": "0.5",
"php-parallel-lint/php-parallel-lint": "1.3.0",
"phpunit/phpunit": "^8.5",
"psy/psysh": "0.10.5",
"seld/jsonlint": "1.8.3",
"symfony/yaml": "~3.4|~5.1",
"wikimedia/testing-access-wrapper": "~2.0",
"wmde/hamcrest-html-matchers": "^1.0.0"
},
"replace": {
"symfony/polyfill-ctype": "1.99",
"symfony/polyfill-mbstring": "1.99"
},
"suggest": {
"ext-apcu": "Local data cache for greatly improved performance",
"ext-curl": "Improved http communication abilities",
"ext-openssl": "Cryptographical functions",
"ext-wikidiff2": "Diff accelerator",
"monolog/monolog": "Flexible debug logging system",
"nmred/kafka-php": "Send debug log events to kafka"
},
"autoload": {
"psr-0": {
"ComposerHookHandler": "includes/composer",
"ComposerVendorHtaccessCreator": "includes/composer",
"ComposerPhpunitXmlCoverageEdit": "includes/composer"
}
},
"autoload-dev": {
"files": [
"vendor/hamcrest/hamcrest-php/hamcrest/Hamcrest.php",
"vendor/wmde/hamcrest-html-matchers/src/functions.php"
]
},
"scripts": {
"mw-install:sqlite": "php maintenance/install.php --server=http://localhost:4000 --dbtype sqlite --dbpath cache/ --scriptpath '' --pass adminpassword MediaWiki Admin",
"serve": "php -S localhost:4000",
"lint": "parallel-lint --exclude vendor",
"phan": "phan -d . --long-progress-bar",
"phpcs": "phpcs -p -s --cache",
"fix": [
"phpcbf"
],
"pre-install-cmd": "ComposerHookHandler::onPreInstall",
"pre-update-cmd": "ComposerHookHandler::onPreUpdate",
"post-install-cmd": "ComposerVendorHtaccessCreator::onEvent",
"post-update-cmd": "ComposerVendorHtaccessCreator::onEvent",
"test": [
"composer lint .",
"composer phpcs ."
],
"test-some": [
"composer lint",
"composer phpcs"
],
"phpunit": "phpunit",
"phpunit:unit": "phpunit --colors=always --testsuite=core:unit,extensions:unit,skins:unit",
"phpunit:integration": "phpunit --colors=always --testsuite=core:integration,extensions:integration,skins:integration",
"phpunit:coverage": "phpunit --testsuite=core:unit --exclude-group Dump,Broken",
"phpunit:coverage-edit": "ComposerPhpunitXmlCoverageEdit::onEvent",
"phpunit:entrypoint": "php tests/phpunit/phpunit.php"
},
"config": {
"optimize-autoloader": true,
"prepend-autoloader": false
},
"extra": {
"merge-plugin": {
"include": [
"composer.local.json"
],
"merge-dev": false
}
}
}
Changer de version de PHP
modifierComposer ne permet pas de changer de version de PHP en ligne de commande. Pour ce faire, il faut éditer le composer.json en mettant la version cible souhaitée, puis lancer composer update
.
Références
modifier- ↑ https://curl.haxx.se/download.html
- ↑ https://getcomposer.org/doc/articles/versions.md
- ↑ https://igor.io/2013/02/07/composer-stability-flags.html
- ↑ https://getcomposer.org/doc/06-config.md
- ↑ https://coopernet.fr/formation/php/autoload
- ↑ https://getcomposer.org/doc/articles/scripts.md
- ↑ https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/core/+/master/composer.json