Composer
Pourquoi ? 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épendances
Exemples 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 version
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 inconvénients de PEAR !
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 : TestSubTestTestClass => 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-autoload
Astuce : --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 --version
PHP_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 personnels
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_Marseille
Meetup : Marseille-PHP-User-Group

PHP Composer : Pourquoi ? Comment ? Et plus ...

  • 1.
    Composer Pourquoi ? Comment? Et plus ... @AFUP_Marseille - 2015-02-26
  • 2.
    Romain Cambien ● Co-organisateurAFUP Marseille ● Développeur Symfony ● Administrateur système ● Co-fondateur et directeur Technique chez Riverline NOUS RECRUTONS ;) @r_cambien
  • 3.
    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
  • 4.
    Composer ● Créé fin2011 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
  • 5.
    Le client enligne 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.
  • 6.
    Création d’un projet $composer create-project [package] [path] [version] ● Copie le paquet dans le répertoire cible ● Installe les dépendances Exemples 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
  • 7.
    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”
  • 8.
    Où trouver lespaquets ? ● 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
  • 9.
    Où trouver lespaquets ? ● 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 version
  • 10.
    Où trouver lespaquets ? ● 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 inconvénients de PEAR !
  • 11.
    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
  • 12.
    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 : TestSubTestTestClass => 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-autoload Astuce : --optimize pour compiler tous les chemins d'accès aux classes pour de meilleures performances en PROD NE PAS UTILISER EN DEV !!
  • 13.
    Composer global ● Permetd’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 --version PHP_CodeSniffer version 2.2.0 (stable) by Squiz (http://www.squiz.net)
  • 14.
    Création d’un dépôtprivé ● 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 personnels
  • 15.
    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 !
  • 16.
    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
  • 17.
    Interface WEB Configuration desdépôts privés Liste des paquets Packagist Configuration de Toran
  • 18.
    Configurer un dépôtprivé Même fonctionnement que pour les dépôts privés dans le composer.json !
  • 19.
    Configuration de Toran Activationdu 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
  • 20.
  • 21.
    Merci ! Rejoignez l’AFUPMarseille ! Twitter : @AFUP_Marseille Meetup : Marseille-PHP-User-Group