Composer

Composer est un gestionnaire de dépendances qui va permettre de définir les différentes dépendances du projet.

1. Installation

Sous Windows, télécharger le fichier composer-setup.exe (https://getcomposer.org/download/)

2. Utilisation

Dans le dossier du projet, créer le fichier composer.json (syntaxe complète : https://getcomposer.org/doc/04-schema.md#the-composer-json-schema)

Exemple :

{
    "name": "Markdown",
    "description": "Script that will transform your notes taken in the Markdown format (.md files) into a rich website",
    "keywords": ["markdown", "notes", "evernote-like"],
    "homepage": "https://github.com/cavo789/markdown",
    "type": "project",
    "time": "2017-01-22",
    "license": "MIT",
    "require": {
        "php": ">=7.0",
        "erusev/parsedown": "~1.4",
        "twitter/bootstrap": "^3.3"
    },
    "config": {
        "preferred-install": "dist"
    },
    "authors": [{
        "name": "Christophe Avonture",
        "email": "christophe@aesecure.com",
        "homepage": "https://www.aesecure.com",
        "role": "Developer"
    }],
    "support": {
        "source": "https://github.com/cavo789/markdown",
        "issues": "https://github.com/cavo789/markdown/issues",
        "docs": "https://github.com/cavo789/markdown/blob/master/readme.md"
    },
    "scripts": {
        "post-install-cmd": [
            "post-install.bat"
        ],
        "post-update-cmd": [
            "post-install.bat"
        ]
    }
}

Le noeud require indique les dépendances.

3. Ajouter une dépendance

Il faut d’abord trouver le nom de la dépendance, pour cela, se rendre sur https://packagist.org/ et chercher le paquet (p.ex. chercher bootstrap pour trouver twitter/bootstrap).

Ceci fait, en ligne de commandes, taper composer require twitter/bootstrap pour que composer télécharger cette librairie, l’installe dans le dossier /vendor et mette à jour le fichier composer.json lui-même (ce qui est pratique car il récupère alors la version de la dernière version stable).

Note : bien sûr, chaque librairie / script n’est pas forcément disponible via composer. Dans la négative, il faut continuer à mettre à jour “à la main”.

4. Mettre à jour

Pour mettre à jour ses dépendances, il suffit de lancer une session DOS, de se positionner dans le dossier du projet (ce dossier doit contenir le fichier composer.json) et de lancer l’instruction composer.bat update.

Dans l’exemple ci-dessus, la seule dépendance mentionnée est erusev/parsedown et on voit bien ci-dessous que cette version a été téléchargée (en version 1.6.1).

image

Le dossier de destination est vendor. Ce nom de dossier pourrait être changé mais c’est un standard, autant le laisser tel quel (sinon voir https://getcomposer.org/doc/articles/vendor-binaries.md#can-vendor-binaries-be-installed-somewhere-other-than-vendor-bin-)

Note : il est possible de demander la mise-à-jour d’une seule dépendance en spécifiant juste son nom (composer update author/name)

image

5. composer.lock

L’exécution de composer install va créer/mettre-à-jour le fichier composer.lock qui sera créé dans le dossier racine du projet, là où se trouve le fichier composer.json.

composer update va ignorer ce fichier

6. post-install.bat

Le “problème” de composer : il va télécharger toute la dépendance qui, probablement, est un dépôt git. Nous aurons donc, pour Bootstrap, un dossier /vendor/twitter qui fera plus de 11 MB alors qu’au final, il ne faut que quelques fichiers (bootstrap.min.css, bootstrap.min.css.map, ... et quelques fontes)

Composer ne semble pas, d’emblée, proposer un mécanisme pour ne télécharger que certains fichiers aussi un script post-install (qui peut être un fichier .bat, un script .php, un .sh, ... du moment qu’il est exécutable) peut se charger du nettoyage.

L’idée est de copier les fichiers du dossier /vendor/... vers le dossier /libs/... de l’application.

Exemple de fichier post-install.bat

@ECHO OFF

CLS

SET LOG=%cd%\composer.log

ECHO Copy - Start at %DATE% - %TIME% > %LOG%
ECHO Copy - Start at %DATE% - %TIME%
ECHO.

SET VENDOR=%cd%\vendor\
SET LIBS=%cd%\libs\

ECHO Copie les fichiers depuis %VENDOR% vers %LIBS% >> %LOG%
ECHO. >> %LOG%

REM --------------------------------------------------------------------------------------------------
SET LIB=bootstrap\
ECHO  = %LIB% = >> %LOG%
ECHO  = %LIB% =
COPY %VENDOR%twitter\%LIB%dist\css\bootstrap.min.css %LIBS%%LIB%css\bootstrap.min.css >> %LOG%
COPY %VENDOR%twitter\%LIB%dist\css\bootstrap.min.css.map %LIBS%%LIB%css\bootstrap.min.css.map >> %LOG%
COPY %VENDOR%twitter\%LIB%dist\js\bootstrap.min.js %LIBS%%LIB%js\bootstrap.min.js >> %LOG%
COPY %VENDOR%twitter\%LIB%dist\fonts\*.* %LIBS%%LIB%fonts\*.* >> %LOG%

REM ----------------------------------------------------------------------
SET LIB=jquery\
ECHO  = %LIB% = >> %LOG%
ECHO  = %LIB% =
COPY %VENDOR%components\%LIB%jquery.min.js %LIBS%%LIB%jquery.min.js >> %LOG%
COPY %VENDOR%components\%LIB%jquery.min.map %LIBS%%LIB%jquery.min.map >> %LOG%

7. Git

7.1. gitignore

Ajouter /vendor/**/.git dans son fichier .gitignore pour ne pas reprendre les dossiers .git qui se trouve dans le dossier /vendor.

Il est préférable de ne pas ignorer le fichier composer.lock (créé par composer) lors d’un commit dans Git et donc de ne pas l’ajouter au fichier .gitignore. Ceci afin que, sur le site de production, si on lance un composer install que les versions des librairies soient exactement celles qui avaient été utilisées sur le site de développement. composer.lock reprend en effet l’exacte version de chaque librairie installée lors du plus récent update. (note : ceci n’est utilise que si, dans composer.json on mentionne quelque chose comme "name/lib":"1.*"càd qu’on n’a pas bloqué à une version précise). Plus d’info : https://daylerees.com/the-composer-lock-file/

Le dossier /vendor/ (et donc tous ses sous-dossiers) peut être ajouté dans le fichier .gitignore puisqu’il ne sert que le temps de télécharger les dernières versions des librairies/scripts/... et de mettre à jour le dossier /libs.