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.
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.