22 Gennaio, 2013 | Di

Composer, come gestire le dipendenze e vivere felici

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.