Mettre en place un packagist local

Image utilisateur

Dans certains cas, notamment dans les entreprises ou pour des projets personnels, il arrive souvent que des librairies ou des Bundles Symfony2 doivent rester en interne ou n'ont tout simplement pas d'intérêt à être distribués. On se prive alors d'outils très pratique comme Composer et Packagist. Pourtant, il existe des solutions pas si complexe à mettre en place pour permettre une utilisation de Composer avec des librairies internes.

 

La solution la plus simple serait de simplement cloner les sources Git des librairies directement dans le projet mais, on continue de se priver de la facilité et des possibilités de Composer.

Une autre solution serait d'ajouter un dépôt Git à Composer de la façon suivante :

"repositories": [
    {
        "type": "vcs",
        "url":  "git@git.monsite.fr:mon-depot-prive.git"
    }
]

Le problème, c'est que chaque adresse Git doit être ajouté séparément. J'ai aussi remarqué au cours de mes tests que la génération de l'autoloader posait problème (celui du composer.json des dépôts Git n'étaient pas pris en compte).

Installer une version de Packagist sur son serveur

La solution la plus simple selon moi est d'installer une réplique de packagist.org sur son serveur. Les sources du site étant disponible sur GitHub, rien ne vous empêche de les cloner sur votre serveur et de les installer.

Pour l'installation, vous aurez besoin d'une base de données MySQL (mon essai avec postgresql n'a pas été fructueux) et d'un serveur PHP avec Git et Composer installé. Vous pouvez aussi installer Solr et Redis pour des fonctionnalités supplémentaires (recherche et statistique notamment).

L'installation se fait comme tout projet Symfony2 :

# Se déplacer dans le dossier parent d'installation de packagist
cd /var/www/;

# Clonage du dépôt Git
git clone https://github.com/composer/packagist.git;
cd packagist;

# Copie du fichier de parametrage par défaut
cp app/config/parameters.yml.dist app/config/parameters.yml

# Edition du fichier de parametrage utilisé (il est un moment question de clé github, il faut absolument en mettre une même si elle ne sert pas)
vi app/config/parameters.yml

# Installation des dépendances
composer install

# Création de la base de données
php app/console doctrine:schema:create

# Installation des ressources web
php app/console assets:install web

 Il faut ensuite créer un virtualhost qui pointe sur le dossier web et votre installation de packagist est quasiment fini.

Il ne reste plus qu'à mettre en place un cron toutes les minutes par exemple pour exécuter les commandes suivantes (la dernière n'a de sens que si vous avez installé Solr pour la recherche) :

php app/console packagist:update --no-debug --env=prod
php app/console packagist:dump --no-debug --env=prod
php app/console packagist:index --no-debug --env=prod

Je vous conseille quand même de les lancer une première fois manuellement pour éviter tous bugs (et certaines commandes recommandes de les lancer la première fois avec une option particulière).

Utilisation de son serveur Packagist

L'utilisation du serveur Packagist local se fait de la même façon qu'avec le service Packagist.org, vous vous inscrivez et vous ajoutez des dépôts Git. Pour l'utilisation c'est aussi très simple, il suffit juste d'ajouter ce bloc à votre fichier composer.json :

"repositories": [{
    "type": "composer",
    "url": "https://packagist.mon-site.fr/"
}]

Une fois ceci fait, vous pouvez ajouter vos dépendances vers des librairies de votre Packagist ou de Packagist.org, si composer ne trouve pas une librairie dans le premier, il ira la chercher dans le second, le tout avec la gestion de l'Autoload et des dépendances clin.png...

L'auteur

Toshy

Passionné par l'informatique depuis mon plus jeune age, j'anime un blog sur le développement web et les différents domaines qui s'y attachent : administration système, bonne pratique de développement, framework web.
Je suis développeur web de profession, diplômé d'un DUT d'informatique, je travaille actuellement au sein du service informatique d'une université.