La gestione delle dipendenze è una delle funzionalità principali di Composer, permettendo agli sviluppatori php di definire, installare e mantenere aggiornate le librerie e gli strumenti necessari per un progetto PHP.
Il file composer.json
Il nucleo centrale di ogni progetto orchestrato da Composer è rappresentato dal file composer.json. All’interno di questo file json sono contenute le informazioni necessarie alla definizione delle dipendenze del progetto. Ecco una panoramica dei nodi più importanti:
- require: elenco delle librerie da utilizzare nel progetto con le relative versioni.
- require-dev: elenco librerie necessarie solo per la fase di sviluppo, come ad esempio gli strumenti di testing.
- autoload: regole per l’autoloading delle classi del progetto.
- scripts: script custom
Come installare le dipendenze con Composer
Dopo aver definito le dipendenze nel file composer.json, il passo successivo è installarle. Ecco come:
- Inizializzazione del progetto: per inizializzare un nuovo progetto si può usare il comando composer init che andrà a generare un nuovo file composer.json attraverso una serie di prompt interattivi.
- Aggiunta delle dipendenze: è possibile aggiungere nuove dipendenze al progetto con il comando composer require.
- Installazione: tramite il comando composer install verranno installate tutte le dipendenze definite nel file composer.json.
Come aggiornare le dipendenze con Composer
Mantenere le dipendenze aggiornate è fondamentale per la sicurezza e la stabilità del progetto. Ecco come è possibile farlo:
- Aggiornamento singolo: per aggiornare una singola dipendenza usare il comando composer update vendor/package.
- Aggiornamento completo: per aggiornare tutte le dipendenze alla loro ultima versione compatibile con il selettore di versione indicato usare il comando composer update.
Gestione delle versioni con Composer
Definire correttamente le versioni delle dipendenze è fondamentale per prevenire conflitti e mantenere la compatibilità. Composer supporta una varietà di vincoli di versione, tra cui:
- Versioni specifiche: ad esempio 1.0.3.
- Range di versioni: ad esempio >=2.1 <3.0.
- Livello di stabilità: è possibile specificare il livello di stabilità accettato usando flag come @dev @beta ecc ad esempio 1.0.*@beta.
- Operatore Tilde: più flessibile rispetto alla specifica di una versione fissa ma abbastanza restrittivo per evitare aggiornamenti che aggiungono cambiamenti non compatibili.
- ~1.0 equivale a >=1.0 <2.0: accetta qualsiasi versione che inizia con 1. (1.0, 1.1, 1.2, …, 1.9.9).
- ~1.0.0 equivale a >=1.0.0 <1.1.0: accetta qualsiasi versione che inizia con 1.0. (1.0.0, 1.0.1, 1.0.2, …, 1.0.9).
In sostanza, l‘ultimo numero specificato nel vincolo tilde può aumentare, mentre gli altri no.
- Operatore Caret: ancora più flessibile dell’operatore tilde in quanto permette di accettare anche aggiornamenti minori che sono retrocompatibili con la versione attuale. Alcuni esempi:
- ^1.0.0 equivale a >=1.0.0 <2.0.0: accetta qualsiasi versione che inizia con 1. (1.0.0, 1.1.0, 1.2.0, …, 1.9.9), ma non 2.0.0.
- ^0.1.0 equivale a >=0.1.0 <0.2.0: accetta qualsiasi versione che inizia con 0.1. (0.1.0, 0.1.1, 0.1.2, …, 0.1.9), ma non 0.2.0.
- ^0.0.1 equivale a >=0.0.1 <0.0.2: accetta solo patch per la versione 0.0.1.
Come si nota dagli esempi precedenti, permette di aggiornare il pacchetto a qualsiasi nuova versione che non modifica il primo numero non-zero della versione attuale.
Esempio di file composer.json
Per avere una visione più concreta di come è strutturato un file composer.json, prendiamo in considerazione il seguente esempio, che potrebbe essere utilizzato come base di in un progetto in Symfony:
{ "name": "me/myproject", "type": "project", "license": "MIT", "description": "Progetto esempio Symfony", "authors": [ { "name": "Nome Autore", "email": "autore@example.com" } ], "require": { "php": ">=8.1", "doctrine/orm": "^2.11", "symfony/framework-bundle": "^6.3", "symfony/console": "^6.3", "symfony/yaml": "^6.3" }, "require-dev": { "symfony/browser-kit": "^6.3", "symfony/phpunit-bridge": "^6.3", "symfony/debug-bundle": "^6.3", }, "autoload": { "psr-4": { "App\\": "src/" } }, "autoload-dev": { "psr-4": { "App\\Tests\\": "tests/" } }, "config": { "preferred-install": { "*": "dist" }, "sort-packages": true } }
In questo esempio:
- name: identifica univocamente il progetto.
- type: specifica il tipo di progetto.
- license: definisce la licenza sotto cui è distribuito il progetto.
- description: fornisce una breve descrizione del progetto.
- authors: elenco degli autori del progetto.
- require: elenco delle dipendenze necessarie per il progetto.
require-dev: dipendenze necessarie solo per lo sviluppo.