Composer Introduzione al gestore di dipendenze per PHP

Per progetti software integranti soluzioni, librerie, classi o componenti in genere rilasciati da terze parti, inclusi i framework da poter estendere per i propri lavori, poter avere strumenti per l’organizzazione e la gestione delle dipendenze diventa di estremo supporto. Questo articolo è una sorta di “Composer Introduzione ed Esempi” per verificare alcuni possibili casi di utilizzo.

Brevemente è da citare la disponibilità di PEAR (acronimo di PHP Extension and Application Repository), ispirato da CPAN di Perl, come supporto nello svolgimento degli stessi compiti, anzi il sistema di distribuzione è davvero molto diffuso, consentendo di avere direttamente a disposizione centinaia di componenti riutilizzabili.

Logo-composer-transparent

Composer: Introduzione

Composer è un gestore di dipendenze per classi, librerie, framework e software scritto in PHP. Potendo facilitare chi ha esperienza di prodotti simili in altri linguaggi, per paragone può essere associato a quello che offre Bundler per Ruby oppure NPM per Node.js

Non essendo fornita un’interfaccia grafica con cui interagire, i comandi vengono eseguiti attraverso la linea di comando, rendendo Composer veloce e compatto per la gestione delle dipendenze e la manipolazione dei file di configurazione. Essenziale l’integrazione con Packagist una vera e propria miniera per poter sfogliare e cercare componenti direttamente installabili con comandi Composer.

Requisiti ed installazione

Il principale requisito di Composer è la presenza dell’interprete PHP versione 5.3.2 o superiore. Il progetto mette a disposizione all’indirizzohttps://getcomposer.org/installer uno script per un’istallazione di tipo predefinito, da poter passare direttamente all’interprete. L’esperienza di installazione di esaurisce in un “lampo” per esempio utilizzando i seguenti comandi in una shell Linux

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Per Windows, l’installazione è resa ancor più facile con il download e l’esecuzione di https://getcomposer.org/Composer-Setup.exe

Ad installazione avvenuta, è possibile verificare la versione disponibile lanciando il comando base con l’opzione V, es.

root@host:~# composer -V
Composer version 1.0-dev (4d134ce8a2aacb9566fee8deb8c514248fd2a983) 2015-04-08 13:43:49

Adesso Composer è disponibile sul sistema. In base alla cartella di lavoro, le dipendenze saranno gestibili attraverso file con sintassi JSON denominati composer.json da poter creare in maniera automatica anche con il comando composer init.

Per convenzione, la cartella vendor è delegata ad ospitare le dipendenze ed il file di autoload; quindi in progetti che adottano Composer sarà una costante poter vedere il codice seguente all’interno degli script PHP.

require 'vendor/autoload.php';

Definire le proprie dipendenze

Il metodo più semplice per compilare un file composer.json specifico è attraverso Composer stesso.

composer init

Basterà rispondere alla sequenza di domande, per ottenere lo schema desiderato. Per esempio è possibile specificare diverse opzioni in merito a versioni, dipendenze in fase sviluppo e produzione, licenze… incluso un metodo di ricerca interattivo e semplificato (es. creazione di un pacchetto fittizio company/helloworld che richiede symfony). Nel “prezzo” è incluso anche la generazione di un’anteprima:

root@host:/home/alessio# composer init 
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [home/alessio]: company/helloworld
Description []: Just saying hello to the world
Author: Alessio Felicioni <alessio@example.com>
Minimum Stability []:
License []: MIT
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]?Search for a package []: symfony
Found 15 packages matching symfony
 [0] symfony/symfony
 [1] symfony/console
 [2] symfony/yaml
 [3] symfony/filesystem
 [4] symfony/finder
 [5] symfony/process
 [6] symfony/translation
 [7] symfony/debug
 [8] symfony/routing
 [9] symfony/config
[10] symfony/stopwatch
[11] symfony/icu
[12] symfony/validator
[13] symfony-cmf/symfony-cmf
[14] symfony/intl
Enter package # to add, or the complete package name if it is not listed []: 0
Enter the version constraint to require (or leave blank to use the latest version) []:
Using version ~2.6 for symfony/symfony
Search for a package []:
Would you like to define your dev dependencies (require-dev) interactively [yes]?
Search for a package []: symfony
Found 15 packages matching symfony
 [0] symfony/symfony
 [1] symfony/console
 [2] symfony/yaml
 [3] symfony/filesystem
 [4] symfony/finder
 [5] symfony/process
 [6] symfony/translation
 [7] symfony/debug
 [8] symfony/routing
 [9] symfony/config
[10] symfony/stopwatch
[11] symfony/icu
[12] symfony/validator
[13] symfony-cmf/symfony-cmf
[14] symfony/intl
Enter package # to add, or the complete package name if it is not listed []: 0
Enter the version constraint to require (or leave blank to use the latest version) []:
Using version ~2.6 for symfony/symfony
Search for a package []:
{
 "name": "company/helloworld",
 "description": "Just saying hello to the world",
 "require": {
 "symfony/symfony": "~2.6"
 },
 "require-dev": {
 "symfony/symfony": "~2.6"
 },
 "license": "MIT",
 "authors": [
 {
 "name": "Alessio Felicioni",
 "email": "alessio@example.com"
 }
 ]
}
Do you confirm generation [yes]? yes
root@host:/home/alessio#

Composer per installare dipendenze

Supponiamo di aver bisogno di Twig per il nostro progetto. Sarà sufficiente lanciare

composer require "twig/twig:~1.0"

e vedere come Composer si preoccuperà di aggiornare il file JSON, recuperare le nuove dipendenze via Packagist, contrassegnare in file di lock le informazioni sulla versione installata.