Composer, come gestire le dipendenze e vivere felici
Gestire le dipendenze in un progetto software è sempre stato complicato, soprattutto quando il sistema è complesso e le librerie esterne sono tante. Per chi lavora in PHP c'è ora uno strumento nuovo che risolve molti dei problemi dei sistemi precedenti (come l' obsoleto PEAR, ad esempio).
Composer è un tool per la gestione delle dipendenze in PHP che sfrutta tutte le potenzialità della versione 5.3 del linguaggio, come lo standard PSR-0, i namespace e l'autoloading.
Installarlo su un sistema Unix (Linux, Mac Os X) è facile, basta eseguire i seguenti comandi attraverso un terminale:
$ curl -s https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer
Composer funziona leggendo l'elenco dei pacchetti da installare per ogni singolo progetto da un file chiamato composer.json come ad esempio questo:
{ "require":{ "php":">=5.3.3", "symfony/symfony":"2.1.*", "doctrine/orm":">=2.2.3,<2.4-dev", "doctrine/doctrine-bundle":"1.0.*", "twig/extensions":"1.0.*@dev", "kriswallsmith/assetic":"1.1.*@dev", "mopa/bootstrap-bundle":"dev-master", "mopa/composer-bridge":"dev-master", "twitter/bootstrap":"master@dev", "knplabs/knp-paginator-bundle":"2.3" } }
Il file è in formato JSON (JavaScript Object Notation), quindi attenzione a non lasciare una virgola dopo l'ultimo elemento di una lista!
Lanciando il comando:
$ composer install
Composer legge il file, scarica i pacchetti nella versione richiesta e tutte le eventuali dipendenze e crea in automatico un file di autoload da includere nel proprio progetto. Alla fine dell'esecuzione ci troveremo con un file (composer.lock) e una cartella (vendor) in più. All'interno della cartella vendor sono presenti i file dei pacchetti scaricati e i file di autoload creati da Composer stesso. Quale versione di un determinato pacchetto viene scaricata e installata dipende da cosa è stato specificato nel file composer.json; possiamo richiedere una versione ben specifica (ma è decisamente sconsigliato), un intervallo, oppure l'ultima versione (o sotto versione) anche se non ancora marcata come stabile:
- knplabs/knp-paginator-bundle -> verrà installata la versione 2.3
- symfony/symfony -> verrà installata l'ultima versione del ramo 2.1.*, ad oggi è la 2.1.7
- doctrine/orm -> verrà installata l'ultima versione maggiore di 2.2.3 ma minore di 2.4-dev
- twig/extensions -> verrà installata l'ultima versione del ramo 1.0.* anche se non ancora stabile
- mopa/bootstrap-bundle -> verrà installata l'ultima versione del ramo dev-master
Il file composer.lock contiene l'esatta versione installata di tutti i pacchetti descritti dal file composer.json (ad esempio la 2.1.7 per Symfony). Questo è molto utile quando si lavora in team oppure quando l'applicazione va in produzione perché Composer scarica, per ogni pacchetto, la versione identificata dal file composer.lock e questo garantisce che tutti abbiano lo stesso codice. In effetti il contenuto della cartella vendor non va versionato e in ogni ambiente è sufficiente delegare a Composer il compito di gestire pacchetti e autoload. Per quanto riguarda l'autoload, Composer genera un file vendor/autoload.php che contiene tutte le informazioni necessarie per trovare le classi dei pacchetti installati; è sufficiente aggiungere:
require vendor/autoload.php
all'inizio dei propri script per poter richiamare tutte le classi delle librerie esterne, senza sapere a priori in quali file si trovano.
I pacchetti installabili attraverso Composer si trovano principalmente sul sito Packagist e ad oggi sono poco meno di 7000.
Anche Drupal 8 avrà la possibilità di utilizzare le funzionalità messe a disposizione da Composer per la gestione delle librerie di Symfony su cui sarà basato.