
Descarrega o instalador, compara o seu hash SHA-384 com o publicado em composer.github.io/installer.sig e só depois o executa para /usr/local/bin/composer. Versiona o composer.lock, ignora o vendor/. Em produção, composer install --no-dev --optimize-autoloader, nunca composer update e nunca sudo.
O Composer é o gestor de dependências do PHP. Instala as bibliotecas de que um projeto precisa, resolve as dependências dessas bibliotecas, fixa as versões e gera o autoload das classes. Este tutorial cobre a instalação nos três sistemas, os comandos do dia a dia e os erros que custam tempo. Verificado com o Composer 2.10.3 em PHP 8.5.10.
Instalar, verificando a assinatura
A receita que se vê por todo o lado é curl -sS https://getcomposer.org/installer | php. Executa diretamente um ficheiro descarregado, sem verificar nada. O procedimento oficial compara o hash SHA-384 do script com o publicado pelo projeto antes de o lançar.
#!/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 --versionComposer version 2.10.3 2026-08-27 13:34:23Os dois hashes coincidem, o instalador é autêntico. São trinta segundos de trabalho a mais contra a execução de um script arbitrário com os direitos da tua conta.
Windows
Descarregar e executar o Composer-Setup.exe. O instalador deteta o PHP, configura o PATH e atualiza-se sozinho.
macOS
O script acima funciona tal como está. Com o Homebrew:
brew install composerUma nota sobre os tutoriais mais antigos: pedem que acrescentes um alias ao ~/.bash_profile. Desde o macOS Catalina (2019), a shell por omissão é o zsh e esse ficheiro deixou de ser lido. O ficheiro a alterar é o ~/.zshrc. E o alias nem sequer é necessário se o composer.phar estiver instalado em /usr/local/bin/composer com direito de execução.
Linux
sudo apt-get update
sudo apt-get install -y php-cli unzip curl
# depois o script de verificação acimaO pacote composer dos repositórios Debian e Ubuntu está muitas vezes várias versões atrasado. Mais vale o instalador oficial.
Arrancar um projeto
mkdir mon-projet && cd mon-projet
composer init # questionário interativo
composer require monolog/monologEste comando cria ou atualiza três coisas:
composer.json, o que tu pedes. Vai para o versionamento.composer.lock, as versões exatas instaladas, até ao commit. Também vai para o versionamento: é o que garante que toda a equipa e a produção têm o mesmo código.vendor/, os ficheiros descarregados. Não se versiona, vai para o.gitignore.
/vendor/install ou update: a distinção que conta
| Comando | O que faz | Onde usar |
|---|---|---|
composer install | Instala exatamente o que diz o composer.lock | Produção, integração contínua, chegada de alguém à equipa |
composer update | Procura versões mais recentes e reescreve o composer.lock | Máquina de desenvolvimento, nunca em produção |
Lançar composer update num servidor de produção instala versões que ninguém testou. É a causa de um número notável de colocações em produção falhadas.
# Atualizar um só pacote
composer update monolog/monolog
# Atualizar um pacote e as suas dependências
composer update monolog/monolog --with-dependencies
# Ver o que mudaria, sem mudar nada
composer update --dry-runAs restrições de versão
{
"require": {
"php": ">=8.2",
"monolog/monolog": "^3.5",
"symfony/console": "~6.4.0",
"vendor/paquet": "2.1.3"
}
}| Escrita | Aceita | Recusa |
|---|---|---|
^3.5 | 3.5, 3.6, 3.99 | 4.0 |
~6.4.0 | 6.4.0, 6.4.9 | 6.5.0 |
6.4.* | 6.4.0 a 6.4.99 | 6.5.0 |
2.1.3 | apenas 2.1.3 | tudo o resto |
O ^ é a boa escolha por omissão: aceita as correções e os acrescentos, recusa as quebras de compatibilidade. Fixar uma versão exata parece prudente, mas bloqueia as correções de segurança.
Declarar a versão do PHP em require evita instalar um pacote que não vai correr no servidor. E se a máquina de desenvolvimento não tiver a mesma versão que a produção, o config.platform faz resolver as dependências para a versão alvo:
{
"config": {
"platform": {
"php": "8.4.0"
}
}
}O autoload
É a funcionalidade mais útil do Composer e a última que se descobre. A norma PSR-4 associa um prefixo de namespace a uma pasta.
{
"autoload": {
"psr-4": {
"App\\": "src/",
"App\\Tests\\": "tests/"
},
"files": [
"src/fonctions.php"
]
}
}As barras invertidas duplicam-se num ficheiro JSON. É o erro mais frequente neste ficheiro, e fica silencioso até ao momento em que o Composer se recusa a ler o ficheiro:
"App\": "src/" -> JSON INVALIDE (l'antislash échappe le guillemet)
"App\\": "src/" -> correctCom esta configuração, a classe App\Personnages\Guerrier é procurada em src/Personnages/Guerrier.php. O caminho decorre do nome, com barras invertidas no código e barras normais nas pastas.
<?php
declare(strict_types=1);
namespace App\Personnages; // barras invertidas, nunca barras normais
final class Guerrier
{
// …
}<?php
require __DIR__ . '/vendor/autoload.php';
use App\Personnages\Guerrier;
$conan = new Guerrier();Depois de qualquer alteração à secção autoload:
composer dump-autoloadNada de comentários no composer.json
O JSON não tem comentários. Um // deixado no ficheiro torna-o ilegível:
In JsonFile.php line 398:
"./composer.json" does not contain valid JSON
Lexical error on line 5. Comments are not allowed.O comando composer validate verifica o ficheiro antes de o problema aparecer noutro sítio.
Verificar as vulnerabilidades
O composer audit confronta os pacotes instalados com a base de avisos de segurança do ecossistema PHP.
composer auditNo security vulnerability advisories found.É um comando a colocar na integração contínua, depois de composer install: sem pasta vendor/ responde apenas « No installed packages found ». Devolve um código de saída diferente de zero quando um aviso diz respeito ao projeto.
Detetar os pacotes abandonados
O Composer assinala os pacotes cujo autor declarou o abandono, no momento da instalação. O aviso passa muitas vezes despercebido no meio da saída:
Package facebook/php-sdk is abandoned, you should avoid using it.
Use facebook/graph-sdk instead.Um pacote abandonado deixa de receber correções, incluindo as de segurança. Esta mensagem merece uma paragem em vez de a deixar passar.
Colocar em produção
composer install --no-dev --optimize-autoloader --no-interaction --prefer-dist| Opção | Efeito |
|---|---|
--no-dev | Não instala as ferramentas de desenvolvimento (testes, análise estática) |
--optimize-autoloader | Gera uma tabela de correspondência completa, sem procura em disco durante a execução |
--no-interaction | Não faz nenhuma pergunta |
--prefer-dist | Descarrega os arquivos em vez de clonar os repositórios |
E uma regra que vale a pena repetir: nunca lançar o Composer com sudo. Os ficheiros de vendor/ passariam a pertencer ao root, o servidor web deixaria de os conseguir ler, e a cache do Composer iria parar a /root/.composer. Se a instalação global pede sudo, é apenas para escrever em /usr/local/bin, uma vez.
Os comandos do dia a dia
# O que está instalado
composer show
composer show monolog/monolog # detalhe de um pacote
composer show --tree # árvore das dependências
# O que poderia ser atualizado
composer outdated
composer outdated --direct # só as tuas dependências diretas
# Porque é que este pacote está aqui?
composer why psr/log
composer why-not symfony/console 7.0 # o que bloqueia uma subida de versão
# Remover um pacote
composer remove monolog/monolog
# Reparar uma instalação duvidosa
rm -rf vendor composer.lock && composer installDuas flags do Composer 1 ainda arrastam pelos tutoriais. O composer show -i devolve agora um aviso, já que os pacotes instalados são o que se mostra por omissão:
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 não existe, é -V ou --version:
The "--V" option does not exist.Fontes de pacotes especiais
{
"require": {
"moi/mon-paquet": "dev-main"
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/moi/mon-paquet"
}
]
}Para desenvolver um pacote em paralelo com o projeto que o usa, o repositório do tipo path cria uma ligação simbólica: as alterações ficam visíveis de imediato, sem reinstalação.
{
"repositories": [
{
"type": "path",
"url": "../mes-paquets/mon-paquet",
"options": {
"symlink": true
}
}
]
}Os scripts
{
"scripts": {
"test": "phpunit",
"analyse": "phpstan analyse src --level=8",
"verifier": [
"@analyse",
"@test"
]
}
}composer verifierIsto evita ter de decorar os caminhos para vendor/bin e dá a toda a equipa os mesmos comandos.
A reter
- Verificar o hash do instalador antes de o executar.
- Versionar o
composer.lock, ignorar ovendor/. installem produção,updateapenas em desenvolvimento.- Duplicar as barras invertidas no
composer.json, nenhum comentário. composer auditna integração contínua, nuncasudo.
O Composer é a porta de entrada da maior parte das bibliotecas: o PHPMailer para enviar um e-mail e o Ratchet para um servidor WebSocket instalam-se ambos com composer require.
Para continuar: as boas práticas do Composer, as bases da POO em PHP para tirar partido do autoload, e o hub Desenvolvimento web.
Erros frequentes
curl … | php executa um ficheiro descarregado sem qualquer controlo. O procedimento oficial compara o seu hash SHA-384 antes de o lançar."App": "src/" é JSON inválido: a barra invertida escapa as aspas. São precisas duas.Lexical error on line 5. Comments are not allowed. O JSON não aceita comentários.composer install, que segue o composer.lock.vendor/ passam a pertencer ao root e o servidor web deixa de os conseguir ler.The "--V" option does not exist. e You are using the deprecated option "installed". Estas flags vêm do Composer 1.~/.zshrc.

