Image illustrant Comment installer Composer pour PHP sous Windows

Comment installer Composer pour PHP sous Windows

Si vous avez déjà entendu des parler des gestionnaires de packages [1] pour PHP (PEAR, Sparks et autres bundles) vous avez dû vous rendre compte que c’était un peu l’anarchie et qu’aucune initiative ne sortait du lot. Ce qui amène le problème des habitudes liées aux framerwork et non à la qualité du projet et de ses composants.

Or, sortir du lot, c’est exactement ce que fait Composer en suivant une démarche en adéquation avec les outils actuels (GIT pour ne pas le citer).
En effet Composer vous propose de garder à jour vos librairies PHP en utilisant un simple fichier .json et une invite de commande (n’ayez pas peur !) : lui se chargera de les récupérer sur GIT et de gérer les dépendances, magique n’est-il pas ?

Installer Composer

Rien de plus simple [2], il vous suffit de télécharger et d’installer ce setup.exe qui aura tout de même besoin d’un moteur PHP pour parvenir à ses fins (par exemple celui de Wamp c:\wamp\bin\php\phpx.x.x\php.exe). Et hop, c’est fait, fermez toutes les invites de commandes ouvertes, lancez-en une nouvelle et saisissez composer about pour vérifier que l’installation s’est bien déroulée. Si cela n’est pas le cas, essayez de l’installer à la main.

Pour les environnements Mac/Linux, c’est presque la même procédure et selon que vous voulez l’installer et créer le raccourci avec cette commande :

$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer

Manipuler composer.json

Vous comprenez quelque mots d’anglais et la structure d’un fichier .json ? Ça devrait suffire : créez un fichier composer.json dans le répertoire de votre projet et je vous explique ensuite comment le remplir.

**Déclarer une dépendance

C’est la plus simple indication pour Composer : charge et maintiens à jour SwiftMailer :

{
        "require": {
                "swiftmailer/swiftmailer": "*",
        }
}

**Déclarer une dépendance à une branche

Cette déclaration va prendre en compte la version 4.3.1 et la 4.3.2 lorsqu’elle sera disponible. Cette notation m’évite d’avoir trop de surprises lorsqu’on passe à la branche 4.4, branche qui pourrait apporter des changements trop importants que pour être intégrée sans tests de ma part.

"swiftmailer/swiftmailer": "4.3.*",

**Déclarer une dépendance à une version spécifique

Et si je ne veux qu’une version précise ? Rien de plus logique que ceci.

"swiftmailer/swiftmailer": "4.3.1",

**Comment connaître tous les packages et leurs versions ?

Ils ont pensé à tout, ne vous tracassez pas : Packagist.org est le site qui répertorie tous les packages accessibles via composer.

Charger les packages

Maintenant que les dépendances à votre projet sont déclarées, il reste à les récupérer. Ouvrez une invite de commande dans le répertoire où vous avez créé votre fichier composer.json.

composer install

Si tout se passe bien, vous devriez voir apparaître un dossiers vendors dans lequel se placeront toutes vos dépendances déclarées ainsi qu’un fichier composer.lock (à garder).

**Oui mais moi je veux que ce soit dans /carottes

Vous voulez installer vos dépendances dans un autre répertoire. Ok, rien de plus simple : ouvrez votre fichier composer.json et ajoutez-y le répertoire de destination :

{
        "require": {
                "swiftmailer/swiftmailer": "4.3.*",
        },
        "config" : {
                "vendor-dir" : "carottes"
        }
}

L’autoloading

Composer ne s’arrête pas à ça et gère pour vous le chargement de chacun de ces packages avec un beau fichier d’autoload.
Composer fonctionnera correctement avec les packages respectant PSR-0 [3].

Du coup, importer tous vos packages dans votre projet est aussi simple que ça :

include_once './vendor/autoload.php';

ou (pour les plus lapins d’entre vous)

include_once './carottes/autoload.php';

Mettre à jour ses packages

Vous vous rendez compte que Facebook a mis son SDK à jour et que ça corrige un bug que vous aviez ? Pas de panique, lancez une invite de commande et écrivez ceci (en pensant à toutes les manipulations évitées, merci Composer) :

composer update

Du sens pratique

Afin d’éviter que chacun descomposer update que vous ferez n’impacte votre système de version (GIT dans mon cas), je vous propose de mettre à jour votre .gitignore comme ceci :

/vendor

et pour ceux ayant choisi l’installation « locale au projet » ajoutez aussi cette ligne :

composer.phar

[Mise à jour 10/01/2014] : N’y placez pas votre composer.lock afin de garder des versions de package strictement similaires lorsque vos collaborateurs lanceront composer install (Merci Johann Brocail).

Pour conclure

Dans ma recherche du workflow parfait, composer me permet plusieurs choses :

  • Gagner du temps et de la qualité en profitant des packages
  • Suivre les évolutions des packages
  • Mettre à jour mes packages et leurs dépendances en une fraction de seconde

En d’autres mots je m’évite cette pénitence que de m’abonner au flux RSS d’un projet pour me tenir au courant des versions. De chercher le repository Git, de faire un clone ou de télécharger l’archive, la décompresser et l’installer pour ensuite l’ajouter à mon repository local. (au bas mot 5 bonnes minutes sans compter la déconcentration).

Je suis sûr que Composer est promu à un bel avenir avec des frameworks PHP qui commencent à l’intégrer (FuelPHP, Laravel 4, Codeigniter, Symfony 2) et fera gagner un temps précieux à ceux passant encore par le (chronophage) copier/coller des fichiers.


Notes de l'article

[1Un package est une libraire de fonctions indépendante du projet sur lequel vous travaillez. Elle est généralement là pour vous aider en vous évitant de réinventer la roue à chaque nouveau projet.

[2Travaillant sous Windows, je suis rarement gâté lorsqu’il s’agit d’installer un outil en ligne de commande, celui-ci déroge à la règle et ça vaut la peine de le souligner puisqu’il propose un installeur qui se chargera d’ajouter ce qu’il faut où il faut (y compris les variables d’environnement PATH).

[3Un standard mis en place par le PHP Standard Group pour réguler la/les solutions à ce besoin commun