Comment mettre à jour et/ou compléter son projet Symfony 2.1 avec Composer

Cet article est la suite de mon précédent article sur l'installation d'un Projet Symfony 2.1 géré avec Git et Composer.Je vais aborder les 2 points classiques du cycle de vie d'un projet Symfony 2: mettre à jour la librairie et ajouter de nouveaux bundles à un projet existant. Je vous rappelle que cet article est écris pour les utilisateurs qui comme moi se basent sur des tags et non sur la branche dev-master de Symfony2.

1. Rappel sur Composer

Composer permet de gérer les dépendances de  Symfony2.1. Il se base sur 2 fichiers composer.json et composer.lock.
Composer.json contient la liste des bundles que l'on veut installer et doit être modifié en conséquence.
Composer.lock est un fichier interne à Composer, que l'utilisateur ne doit pas modifier. Il contient la liste des bundles et leurs dépendances qui sont installés ainsi que la version utilisée pour chacun.

Les deux principales commandes de Composer sont 'install' qui installe les dépendance depuis le fichier .json si le fichier .lock n'existe pas et 'update' qui met à jour les versions des dépendances.

2. Ajout de nouveaux bundles

Pour illustrer, imaginons que je souhaite intégrer le bundle MopaBootstrapBundle à mon projet Symfony. Je dois éditer le fichier composer.json pour y ajouter le bundle.

 
{
    ...
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "2.1.*",
        "doctrine/orm": "2.2.*",
        "doctrine/doctrine-bundle": "dev-master",
        "twig/extensions": "dev-master",
        "symfony/assetic-bundle": "dev-master",
        "symfony/swiftmailer-bundle": "dev-master",
        "symfony/monolog-bundle": "dev-master",
        "sensio/distribution-bundle": "dev-master",
        "sensio/framework-extra-bundle": "dev-master",
        "sensio/generator-bundle": "dev-master",
        "jms/security-extra-bundle": "1.1.*",
        "jms/di-extra-bundle": "1.0.*",
        "propel/propel-bundle": "1.1.*",
        "willdurand/propel-eventdispatcher-behavior": "dev-master",
        "mopa/bootstrap-bundle": "dev-master"                <--- cette ligne
    },
   ...
}
 

Ensuite il faut mettre à jour les dépendances du projet avec Composer. Attention, il faut absolument nommer le ou les bundles que l'on veut mettre à jour dans la commande sinon Composer mettra à jour toutes les dépendances en se basant sur la branche master et vous perdrez la stabilité donnée par les tags.

 
> php composer.phar update mopa/bootstrap-bundle

Si à l'issue de cette commande vous avez une erreur indiquant que le JSON n'est pas valide, vous avez surement laissé une virgule à la fin de la dernière ligne du require dans le fichier composer.json.

MAJ 10/02/2013
Composer a évolué, il est maintenant possible d'ajouter des bundles dans Symfony2 sans avoir à éditer le fichier composer.json grace à la fonction "require".

 
> php composer.phar require mopa/bootstrap-bundle

Pour chaque bundle ajouté, composer vous demandera la version que vous voulez installer.


N'oubliez pas d'ajouter le bundle au fichier app/AppKernel.php.

3.Mettre à jour les sources de Symfony

La mise à jour de Symfony est je trouve vraiment pas intuitive. Tel qu'est fait le fichier composer.json, il est impossible de spécifier un tag, on ne peut mettre que "2.1.*" comme version ce qui pointent obligatoirement sur la branche dev-master. J'espère que la version finale de Symfony 2.1 corrigera ce problème. En attendant pour faire évoluer la librairie de tag en tag, je n'ai trouvé qu'une seule solution.

Mon projet est atuellement basé sur le tag 2.1Beta3 et je souhaite mettre à jour vers 2.1RC2. La seule procédure que j'ai trouvé consiste à remplacer le fichier composer.lock par celui du tag que l'on souhaite puis utiliser l'update de composer pour ajouter les bundles supplémentaire et installer les dépendances.

Je commence par remplacer mon fichier composer.lock par celui du tag qui m'interesse.

 
> rm composer.lock
> wget https://raw.github.com/symfony/symfony-standard/v2.1.0-RC2/composer.lock

L'installation de la nouvelle version se fait en une ligne de commande avec l'option "install" pour un projet qui n'utilise pas de bundle complémentaire ou avec l'option "update" pour les projets avec des bundles complémentaires.

 
#sans bundle complémentaire:
> php composer.phar install
 
#avec des bundles complémentaires:
> php composer.phar update propel/propel-bundle willdurand/propel-eventdispatcher-behavior mopa/bootstrap-bundle

 

Symfony est maintenant à jour, il ne reste plus qu'à commiter le fichier composer.lock et à prévenir les personnes qui travaillent sur le projet de faire une maj de leur dépendance avec l'option install de composer.phar.

 

MISE A JOUR 11/09/2012: Je viens de mettre à jour mon projet de la version beta vers Symfony 2.1.1. J'ai du aussi télécharger le fichier composer.json car trop différent par rapport au version beta. Il ne fat pas oublier d'ajouter la liste des dépendances ajoutées à la version standard du framework. Pensez aussi à jeter un oeil sur le changelog.

Il y a 4 commentaires

  • seb12-01-2012 16:52:31

    installer les fixtures : mission impossible !

    après recherche, on comprend très vite que les fixtures ne sont pas une fonctionnalité activée par défaut. mais tous les tutos exsitant font référence chacun à une version différente et la structure des dossiers est toujours différente.
    j'ai finalement trouvé la doc officielle, mais même avec, j'ai des erreurs
    ma version 2.1.3
    http://symfony.com/fr/doc/master/bundles/DoctrineFixturesBundle/index.html

    j'ai une erreur suite à la déclaration dans le fichier appkernel.
    "Class 'Doctrine\Bundle\DoctrineFixturesBundle\DoctrineFixturesBundle' not found in ..."

  • Bruno12-01-2012 21:40:04

    Bonjour,

    J'essai désespérément d'ajouter un bundle héritant de FOSUser.
    Hors, après
    - l'installation de FOSUser via composer,
    - La création d'un bundle héritant de FOSUserBundle

    J'ai l'erreur suivante lors que j'accede à mon buddle principale :
    MappingException: The class 'MonApp\UtilisateurBundle\Entity\Utilisateur' was not found in the chain configured namespaces MonApp\BackEndBundle\Entity


    Tous se passe comme si le class loader ne trouve pas la classe de mon nouveau bundle "UserBundle" mis en place pour hériter de FOSUserBundle .

    En Symfony2.1, il semble que tous se qui se trouve dans /src soit accessible mais la .... non.
    Faut-il faire autre chose que l'enregistrer dans le AppKernel pour pourvoir en utiliser les classes de son namespace ?
    En Symfony 2.0, il fallait modifier autoload.php pour y integrer son namespace mais la fonction n'existe plus en 2.1.
    Je suis un peu perdu..
    Auriez-vous des pistes ?

  • Ulrich12-03-2012 13:28:18

    Je viens d'essayer sur une instal toute neuve de sf2 et je n'ai aucun soucis. Voici les commandes que j'ai utilisé:

     
    > git clone https://github.com/symfony/symfony-standard.git
    > cd symfony-standard
    >  git checkout v2.1.3
    > php composer.phar install
     
    #Edition du fichier json
     
    > php composer.phar update doctrine/doctrine-fixtures-bundle
     

    Et pour finir édition de AppKernel.php

     
     $bundles = array(
                new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
                new Symfony\Bundle\SecurityBundle\SecurityBundle(),
                new Symfony\Bundle\TwigBundle\TwigBundle(),
                new Symfony\Bundle\MonologBundle\MonologBundle(),
                new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
                new Symfony\Bundle\AsseticBundle\AsseticBundle(),
                new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
                new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
                new JMS\AopBundle\JMSAopBundle(),
                new JMS\DiExtraBundle\JMSDiExtraBundle($this),
                new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
                new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(),
            );
     

    La ligne de commande doctrine:fixture:load est disponible et n'envoie aucune erreur.

    Avez vous vérifier que les fichiers existaient dans vendor/doctrine/doctrine-fixtures-bundle/Doctrine/Bundle/FixturesBundle/ ?

  • Ulrich12-03-2012 13:36:30

    Bonjour, depuis symfony 2.1 l'autoload est gérer par composer. Vous pouvez relancer le calcul de l'autoload avec la comamnde:

     
    > php composer.phar  dump-autoload  --optimize

    N'avaez vous pas une faute de frappe dans la déclaration d'un namespace? Avez vous bien spécifier comment surcharger un bundle: http://symfony.com/doc/master/cookbook/bundles/inheritance.html ?