Installare Composer su Windows, macOS e Linux: guida completa

Installare Composer su Windows, macOS e Linux: guida completa
Risposta rapida

Scarica il programma di installazione, confronta la sua impronta SHA-384 con quella pubblicata su composer.github.io/installer.sig, poi eseguilo verso /usr/local/bin/composer. Versiona composer.lock, ignora vendor/. In produzione usa composer install --no-dev --optimize-autoloader, mai composer update e mai sudo.

Composer è il gestore di dipendenze di PHP. Installa le librerie di cui un progetto ha bisogno, risolve le loro dipendenze, blocca le versioni e genera l’autoload delle classi. Questo tutorial copre l’installazione sui tre sistemi, i comandi di tutti i giorni e gli errori che costano tempo. Verificato con Composer 2.10.3 su PHP 8.5.10.

Installare, verificando la firma

La ricetta che si trova ovunque è curl -sS https://getcomposer.org/installer | php. Esegue direttamente un file scaricato, senza controllare niente. La procedura ufficiale confronta l’impronta SHA-384 dello script con quella pubblicata dal progetto prima di lanciarlo.

installer-composer.sh
#!/usr/bin/env bash
set -euo pipefail

ATTENDU=$(curl -sS https://composer.github.io/installer.sig)
curl -sS https://getcomposer.org/installer -o composer-setup.php
CALCULE=$(php -r "echo hash_file('sha384', 'composer-setup.php');")

if [ "$ATTENDU" != "$CALCULE" ]; then
    >&2 echo 'ERREUR : signature invalide, ne pas exécuter'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php --quiet --install-dir=/usr/local/bin --filename=composer
rm composer-setup.php
composer --version
code
Composer version 2.10.3 2026-08-27 13:34:23

Le due impronte coincidono: il programma di installazione è autentico. Sono trenta secondi di lavoro in più contro l’esecuzione di uno script arbitrario con i diritti del tuo account.

Windows

Scarica ed esegui Composer-Setup.exe. Il programma di installazione rileva PHP, configura il PATH e si aggiorna da solo.

macOS

Lo script qui sopra funziona così com’è. Con Homebrew:

bash
brew install composer

Una precisazione sui tutorial più vecchi: chiedono di aggiungere un alias in ~/.bash_profile. Da macOS Catalina (2019) la shell predefinita è zsh, e quel file non viene più letto. Il file da modificare è ~/.zshrc. E l’alias non serve comunque, se composer.phar è installato in /usr/local/bin/composer con il permesso di esecuzione.

Linux

bash
sudo apt-get update
sudo apt-get install -y php-cli unzip curl
# poi lo script di verifica qui sopra

Il pacchetto composer dei repository Debian e Ubuntu è spesso indietro di diverse versioni. Meglio il programma di installazione ufficiale.

Avviare un progetto

bash
mkdir mon-projet && cd mon-projet
composer init          # questionario interattivo
composer require monolog/monolog

Questo comando crea o aggiorna tre cose:

  • composer.json, quello che chiedi. Va versionato.
  • composer.lock, le versioni esatte installate, al commit preciso. Va versionato anche lui: è ciò che garantisce che tutta la squadra e la produzione abbiano lo stesso codice.
  • vendor/, i file scaricati. Non va versionato, mettilo nel .gitignore.
.gitignore
/vendor/

install o update: la distinzione che conta

Comando Che cosa fa Dove usarlo
composer install Installa esattamente quello che dice composer.lock Produzione, integrazione continua, arrivo di una persona nella squadra
composer update Cerca versioni più recenti e riscrive composer.lock Macchina di sviluppo, mai in produzione

Lanciare composer update su un server di produzione installa versioni che nessuno ha testato. È la causa di un numero notevole di messe in produzione fallite.

bash
# Aggiornare un solo pacchetto
composer update monolog/monolog

# Aggiornare un pacchetto e le sue dipendenze
composer update monolog/monolog --with-dependencies

# Vedere che cosa cambierebbe, senza cambiare niente
composer update --dry-run

I vincoli di versione

composer.json
{
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.5",
        "symfony/console": "~6.4.0",
        "vendor/paquet": "2.1.3"
    }
}
Scrittura Consente Rifiuta
^3.5 3.5, 3.6, 3.99 4.0
~6.4.0 6.4.0, 6.4.9 6.5.0
6.4.* da 6.4.0 a 6.4.99 6.5.0
2.1.3 solo 2.1.3 tutto il resto

Il ^ è la scelta predefinita giusta: consente le correzioni e le aggiunte, rifiuta le rotture di compatibilità. Fissare una versione esatta sembra prudente, ma blocca le patch di sicurezza.

Dichiarare la versione di PHP in require evita di installare un pacchetto che non girerà sul server. E se la macchina di sviluppo non ha la stessa versione della produzione, config.platform fa risolvere le dipendenze per la versione di destinazione:

json
{
    "config": {
        "platform": {
            "php": "8.4.0"
        }
    }
}

L’autoload

È la funzione più utile di Composer, e quella che si scopre per ultima. Lo standard PSR-4 associa un prefisso di namespace a una cartella.

composer.json
{
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "App\\Tests\\": "tests/"
        },
        "files": [
            "src/fonctions.php"
        ]
    }
}

I backslash vanno raddoppiati in un file JSON. È l’errore più frequente su questo file, ed è silenzioso fino al momento in cui Composer si rifiuta di leggerlo:

code
"App\": "src/"     -> JSON INVALIDE (l'antislash échappe le guillemet)
"App\\": "src/"    -> correct

Con questa configurazione la classe App\Personnages\Guerrier viene cercata in src/Personnages/Guerrier.php. Il percorso deriva dal nome: backslash nel codice, barre nelle cartelle.

src/Personnages/Guerrier.php
<?php

declare(strict_types=1);

namespace App\Personnages;   // backslash, mai barre

final class Guerrier
{
    // …
}
index.php
<?php

require __DIR__ . '/vendor/autoload.php';

use App\Personnages\Guerrier;

$conan = new Guerrier();

Dopo ogni modifica alla sezione autoload:

bash
composer dump-autoload

Nessun commento in composer.json

JSON non ha commenti. Un // infilato nel file lo rende illeggibile:

code
In JsonFile.php line 398:
  "./composer.json" does not contain valid JSON
  Lexical error on line 5. Comments are not allowed.

Il comando composer validate controlla il file prima che il problema salti fuori altrove.

Controllare le vulnerabilità

composer audit confronta i pacchetti installati con il database di avvisi di sicurezza dell’ecosistema PHP.

bash
composer audit
code
No security vulnerability advisories found.

È un comando da mettere nell’integrazione continua, dopo composer install: senza cartella vendor/ risponde solo « No installed packages found ». Restituisce un codice di uscita diverso da zero quando un avviso riguarda il progetto.

Individuare i pacchetti abbandonati

Composer segnala i pacchetti il cui autore ne ha dichiarato l’abbandono, al momento dell’installazione. L’avviso passa spesso inosservato nel flusso dell’output:

code
Package facebook/php-sdk is abandoned, you should avoid using it.
Use facebook/graph-sdk instead.

Un pacchetto abbandonato non riceve più correzioni, comprese quelle di sicurezza. Su questo messaggio vale la pena fermarsi, invece di lasciarlo scorrere.

Andare in produzione

bash
composer install --no-dev --optimize-autoloader --no-interaction --prefer-dist
Opzione Effetto
--no-dev Non installa gli strumenti di sviluppo (test, analisi statica)
--optimize-autoloader Genera una tabella di corrispondenza completa, senza ricerche su disco a runtime
--no-interaction Non pone nessuna domanda
--prefer-dist Scarica gli archivi invece di clonare i repository

E una regola che vale la pena ripetere: non lanciare mai Composer con sudo. I file di vendor/ apparterrebbero a root, il server web non riuscirebbe più a leggerli, e la cache di Composer finirebbe in /root/.composer. Se l’installazione globale chiede sudo, è solo per scrivere in /usr/local/bin, una volta sola.

I comandi di tutti i giorni

bash
# Che cosa è installato
composer show
composer show monolog/monolog        # dettaglio di un pacchetto
composer show --tree                 # albero delle dipendenze

# Che cosa si potrebbe aggiornare
composer outdated
composer outdated --direct           # solo le tue dipendenze dirette

# Perché questo pacchetto è qui?
composer why psr/log
composer why-not symfony/console 7.0 # che cosa blocca un passaggio di versione

# Rimuovere un pacchetto
composer remove monolog/monolog

# Riparare un'installazione dubbia
rm -rf vendor composer.lock && composer install

Due flag di Composer 1 girano ancora nei tutorial. composer show -i restituisce ormai un avviso, dato che i pacchetti installati sono l’output predefinito:

code
You are using the deprecated option "installed". Only installed packages are
shown by default now. The --all option can be used to show all packages.

E composer --V non esiste, si scrive -V oppure --version:

code
The "--V" option does not exist.

Sorgenti di pacchetti particolari

json
{
    "require": {
        "moi/mon-paquet": "dev-main"
    },
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/moi/mon-paquet"
        }
    ]
}

Per sviluppare un pacchetto in parallelo al progetto che lo usa, il repository di tipo path crea un collegamento simbolico: le modifiche si vedono subito, senza reinstallare niente.

json
{
    "repositories": [
        {
            "type": "path",
            "url": "../mes-paquets/mon-paquet",
            "options": {
                "symlink": true
            }
        }
    ]
}

Gli script

json
{
    "scripts": {
        "test": "phpunit",
        "analyse": "phpstan analyse src --level=8",
        "verifier": [
            "@analyse",
            "@test"
        ]
    }
}
bash
composer verifier

Così non devi ricordare i percorsi verso vendor/bin, e tutta la squadra ha gli stessi comandi.

Da ricordare

  • Verificare l’impronta del programma di installazione prima di eseguirlo.
  • Versionare composer.lock, ignorare vendor/.
  • install in produzione, update solo in sviluppo.
  • Raddoppiare i backslash in composer.json, nessun commento.
  • composer audit nell’integrazione continua, mai sudo.

Composer è la porta d’ingresso della maggior parte delle librerie: PHPMailer per inviare un’email e Ratchet per un server WebSocket si installano entrambi con composer require.

Per continuare: le buone pratiche di Composer, le basi della programmazione a oggetti in PHP per sfruttare l’autoload, e l’hub Sviluppo web.

Errori frequenti

Programma di installazione eseguito senza verifica curl … | php esegue un file scaricato senza nessun controllo. La procedura ufficiale ne confronta l'impronta SHA-384 prima di lanciarlo.
Backslash singolo in composer.json "App": "src/" è un JSON non valido: il backslash fa da escape alle virgolette. Ce ne vogliono due.
Commento in composer.json Lexical error on line 5. Comments are not allowed. JSON non accetta commenti.
composer update in produzione Installa versioni che nessuno ha testato. In produzione si usa composer install, che segue composer.lock.
Composer lanciato con sudo I file di vendor/ appartengono allora a root e il server web non riesce più a leggerli.
composer --V e composer show -i The "--V" option does not exist. e You are using the deprecated option "installed". Questi flag vengono da Composer 1.
~/.bash_profile su macOS Da macOS Catalina la shell predefinita è zsh: quel file non viene più letto, si usa ~/.zshrc.

ComposerDépendancesPHP

Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.