ComposerPourquoi ? Comment ? Et plus ...
@AFUP_Marseille - 2015-02-26
Romain Cambien● Co-organisateur AFUP Marseille● Développeur Symfony● Administrateur système● Co-fondateur et
directeur Technique chez Riverline
NOUS RECRUTONS ;)@r_cambien
Gestion des dépendances :
● Manuelle :Télécharger, décompresser, recommencer ...
● PEAR : http://pear.php.net/
● Pas de dépendances par projet● Installation système● Peu de paquets, ajout de paquets compliqués
PEAR : 600 vs Compser : > 50 000
Composer
● Créé fin 2011 par Nils Adermann et Jordi Boggiano
● Deux parties :○ Composer : le client en ligne de commande○ Packagist : le dépôt de paquets par défaut
● Inspiré de NPM et Bundler● Promotion du DRY
Le client en ligne de commande
● Installation :$ curl -sS https://getcomposer.org/installer | php.
Astuce :$ curl -sS http://getcomposer.org/installer | php -- --install-dir=~/bin --filename=composer.
● Mise à jour$ composer self-update.
● Installer les dépendances$ composer install.
Création d’un projet $ composer create-project [package] [path] [version]
● Copie le paquet dans le répertoire cible● Installe les dépendancesExemples avec des frameworks :
Zend :$ composer create-project --stability="dev" \ zendframework/skeleton-application path/to/install
Laravel :$ composer create-project --prefer-dist \ laravel/laravel path/to/install
Symfony :$ composer create-project \ symfony/framework-standard-edition path/to/install
Le fichier composer.json{ "name": "symfony/framework-standard-edition", "license": "MIT", "type": "project", "description": "The \"Symfony Standard Edition\" distribution", "autoload": { "psr-0": { "": "src/" } }, "require": { "php": ">=5.3.3", "symfony/symfony": "2.3.*", "doctrine/orm": "~2.2,>=2.2.3,<2.5", "doctrine/dbal": "<2.5", "doctrine/doctrine-bundle": "~1.2", "twig/extensions": "1.0.*", "symfony/assetic-bundle": "~2.3", "symfony/swiftmailer-bundle": "~2.3", "symfony/monolog-bundle": "~2.4", "sensio/distribution-bundle": "~2.3", "sensio/framework-extra-bundle": "~3.0,>=3.0.2", "sensio/generator-bundle": "~2.3", "incenteev/composer-parameter-handler": "~2.0" }, "scripts": { "post-install-cmd": [ ... ], "post-update-cmd": [ ... ] }, "config": { "bin-dir": "bin" }, "minimum-stability": "stable", “extra”: { ... }}
Nom du projet
Configuration de l’autoloader
Dépendances
Stabilité par défaut
Supérieur à une version
N’importe quelle version 2.3
N'importe quelle version non majeur ( entre 1.2 et 2 )
N’importe quelle version 3 mais supérieure à 3.0.2
Inférieur à une version
“test/test”: “dev-master”
Dernier commit dans le dépôt DEV
Forcer la stabilité : “2.*@dev”
Où trouver les paquets ?
● Packagist.org : le dépôt par défaut$ composer require "monolog/monolog: 1.12.*".
● Git / SVN / Mercurical :{ . "repositories": [ . { . "type": "vcs", . "url": "https://github.com/igorw/monolog" . } . ], . "require": { . "monolog/monolog": "dev-bugfix" . } .} .
● Gestion des tags comme version du paquet● Gestion des archives avec GitHub et BitBucket
Où trouver les paquets ?● Paquet ne supportant pas Composer{ . "repositories": [ . { . "type": "package", . "package": { . "name": "smarty/smarty", . "version": "3.1.7", . "dist": { . "url": "http://www.smarty.net/files/Smarty-3.1.7.zip", . "type": "zip" . }, . "autoload": { . "classmap": ["libs/"] . } . } . } . ], . "require": { . "smarty/smarty": "3.1.*" . } .} .
Même ve
rsion
Où trouver les paquets ?● PEAR { . "repositories": [ . { . "type": "pear", . "url": "http://pear2.php.net" . } . ], . "require": { . "pear-pear2.php.net/PEAR2_Text_Markdown": "*", . "pear-pear2/PEAR2_HTTP_Request": "*" . } .} .
PEAR sans les inco
nvénients de P
EAR !
Le fichier composer.lock
● Généré par composer update● Lu par composer install● Conserver les versions exactes des paquets
Également la référence du commit pour les “dev-master”
● Doit être inclus dans le projet● Ne doit pas être modifié à la main
Autoloader Composer
● Généré lors d’un update ou install● Disponible dans ./vendor/autoload.php● Respecte les règles de chaque paquet
○ PSR-0 : Test\SubTest\TestClass => Test/SubTest/TestClass.php○ PSR-4○ ClassMap : Cherche les classes dans tous les fichiers ○ File : inclus un fichier
● Peut être régénéré par : $ composer dump-autoloadAstuce : --optimize pour compiler tous les chemins d'accès aux classes pour de meilleures performances en PROD
NE PAS UTILISER EN DEV !!
Composer global
● Permet d’installer des outils PHP● S’utilise en rajoutant l’argument global
$ composer global require "squizlabs/php_codesniffer=2.*"$ composer global update$ composer global remove squizlabs/php_codesniffer
● Installe les paquets dans : ~/.composer/vendor/
● Rendre disponible les binaires en ajoutant dans le ~/.profile : PATH=~/.composer/vendor/bin:$PATH
$ phpcs --versionPHP_CodeSniffer version 2.2.0 (stable) by Squiz (http://www.squiz.net)
Création d’un dépôt privé
● Packagist : https://github.com/composer/packagist○ Installation et configuration complexes○ Trop de fonctionnalités ( gestion utilisateurs, etc … )
● Satis : https://github.com/composer/satis○ Packagist allégé○ Reste complexe à configurer et à maintenir
● Toran Proxy : https://toranproxy.com/○ Produit commercial par le créateur de Composer○ Permet de soutenir le développement de Composer○ Installation rapide et peu de configuration
Gratuit pour les développements personne
ls
Installation de Toran
● Télécharger● Décompresser● Renommer et configurer
./app/config/parameters.yml.dist en ./app/config/parameters.yml
● Configurer un vhost sur ./web/Astuce : Tester avec PHP >= 5.4 : ./app/console server:run --env=prod
● Configurer une Crontab pour ./bin/cron● Terminer … ça marche !
Toran Proxy
Packagist.orgProjet
Toran
{ "repositories": [ {"type": "composer", "url": "http://toran.example.com/repo/packagist/"}, {"packagist": false} ]}
{ "repositories": [ {"type": "composer", "url": "http://toran.example.com/repo/private/"}, {"type": "composer", "url": "http://toran.example.com/repo/packagist/"}, {"packagist": false} ]}
GIT / SVN / HG
Interface WEB
Configuration des dépôts privés
Liste des paquets Packagist
Configuration de Toran
Configurer un dépôt privé
Même fonctionnement que pour les dépôts privés dans le composer.json !
Configuration de Toran
Activation du proxy Packagist
Configuration de la cache des archives :● Lazy : Cache à la demande● New tags : Cache toutes les versions plus récentes que
la plus vieille version en cache● All : Cache toutes les versions
Questions ?
Merci !
Rejoignez l’AFUP Marseille !
Twitter : @AFUP_MarseilleMeetup : Marseille-PHP-User-Group