Composer - Gerenciando dependências

Como escolher versões, instalar, atualizar, remover pacotes e manter seu projeto saudável com comandos, fluxos e dicas de troubleshooting.
Para quem é? Devs PHP que já usam Composer no dia a dia e querem dominar versionamento, atualização segura e diagnóstico de conflitos (com exemplos “mão na massa”).
Por que isso importa
Um composer.json
bem definido e um composer.lock
versionado são a base de ambiente reprodutíveis. Saber gerenciar dependências evita que um simples update
quebre a aplicação ou que você fique preso a versões antigas. Além disso, entender faixas de versão (SemVer) e o solver do Composer ajuda a prever impactos com confiança.
Anatomia rápida
composer.json
: declara dependências, autoload, scripts, configs.composer.lock
: trava versões exatas instaladas.vendor/
: onde os pacotes vivem (não versionar; adicione ao.gitignore
).1 2 3 4 5 6 7 8 9 10 11 12
{ "require": { "laravel/framework": "^11.0", "guzzlehttp/guzzle": "^7.8" }, "require-dev": { "pestphp/pest": "^3.0" }, "config": { "sort-packages": true } }
Dica:
"config.sort-packages": true
mantém ocomposer.json
organizado automaticamente.
Adicionando pacotes
- Produção:
1
composer require vendor/pacote:^1.2
- Apenas para desenvolvimento (testes, tooling):
1
composer require --dev pestphp/pest:^3.0
Boas Práticas - Sempre especifique faixas de versão (ex.: ^1.2) em vez de uma versão fixa. - Commits atômicos: “require X”, depois “ajuste código para X”.
Entendendo faixas de versão (SemVer)
Sintaxe | Permite… | Exemplo de intervalo |
---|---|---|
^1.2 |
minor/patch (mantém major) | >=1.2.0 <2.0.0 |
~1.2 |
patch dentro do minor | >=1.2.0 <1.3.0 |
>=1.2 |
qualquer versão a partir de 1.2 |
>=1.2.0 |
1.2.* |
qualquer patch da 1.2 |
>=1.2.0 <1.3.0 |
1.2.3 |
versão exata (evite em libs) | ==1.2.3 |
Estabilidade
- Sufixos:
@RC
,@beta
,@alpha
,@dev
(quanto mais à direita, menos estável). - Projeto inteiro:
1 2 3 4
{ "minimum-stability": "stable", "prefer-stable": true }
- Para um pacote específico, dá para flexibilizar:
"acme/lib-experimental": "^1.0@beta
Instalando vs. atualizando
composer install
usa o lock e instala exatamente as versões travadas. É o que você deve usar em produção e em CI.composer update
recalcula versões dentro das faixas docomposer.json
e escreve no lock.- Atualiza tudo:
composer update
- Atualiza um pacote:
compsoer update vendor/pacote
- Permitir atualizar dependências transientes:
composer update vendor/pacote --with-all-dependencies
- Atualiza tudo:
Atalhos úteis:
1
2
3
4
5
6
7
8
# Atualiza tudo (cautela!)
composer update
# Atualiza só um pacote (mais seguro)
composer update vendor/pacote
# Permite atualizar dependências transientes relacionadas
composer update vendor/pacote --with-all-dependencies # (-W)
Estratégia segura: atualize um pacote por vez, rode testes e valide changelog.
Checando o que pode atualizar
1
2
3
composer outdated # vê pacotes desatualizados
composer outdated --direct # apenas dependências diretas
composer show -l # morstra versão atual e última disponível
Testando limites (integração)
1
composer update --prefer-lowest --prefer-stable
Excelente em CI para capturar dependências implícitas e faixas permissivas demais.
Removendo pacotes
1
composer remove vendor/pacote
O Composer limpa
require
/require-dev
, atualiza olock
e remove davendor/
.
Investigando conflitos
1
2
composer why vendor/pacote # quem exige
composer why-not vendor/pacote ^3.0 # por que não dá pra ir para ^3
Dicas de resolução:
- Simplifique faixas do seu
composer.json
(evite pins desnecessários) - Atualize o pacote e relacionados com
--with-all-dependecies
. - Verifique requisitos de extensões/PHP:
1
composer check-platform-reqs
- Rode diagnósticos:
1 2
composer validate composer diagnose
Auditoria de segurança
1
composer audit
- Verifica vulnerabilidades conhecidas; combine com
composer outdated
para montar um plano de atualização. - Em apps sensíveis, considere políticas de atualização (SLA interno): ex.: “corrigir high/critical em até 48h”.
Repositórios privados e autenticação
1
2
3
4
5
6
7
8
9
10
11
12
# Registrando token global (ex.: evitar rate limit)
composer config -g github-oauth.github.com <SEU_TOKEN>
#exemplo de repo privado
{
"repositories": [
{"type": "vcs", "url": "https://github.com/sua-org/sua-lib-privada"}
],
"require": {
"sua-org/sua-lib-privada": "^1.0"
}
}
Segurança: tokens vivem em
auth.json
(usuário/CI), não nocomposer.json
. Em CI, prefira variáveis de ambiente e--no-interaction
.
Autoload e performance
PSR-4
1
2
3
4
5
6
"autoload": {
"psr-4": { "App\\": "src/" }
},
"autoload-dev": {
"psr-4": { "Tests\\": "tests/" }
}
Após alterar autoload:
1
composer dump-autoload
Otimizações para produção:
1
2
3
4
composer install --no-dev --prefer-dist --optimize-autoloader
# Extras:
# --classmap-authoritative (quando sua árvore é estável)
# --apcu-autoloader (se APCu estiver habilitado)
config
útil no composer.json
1
2
3
4
5
6
7
8
9
"config": {
"sort-packages": true,
"preferred-install": "dist",
"platform": { "php": "8.3.0" }, // trava a "plataforma" alvo do solver
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true,
"php-http/discovery": true
}
}
é excelente para CI, garantindo que o solver não selecione pacotes incompatíveis com a versão de produção.
Campos avançados
conflict
: impede combinações perigosas1
"conflict": { "foo/bar": "<2.0" }
provide
: declara que seu pacote fornece uma interface virtual (útil em libs).replace
: diz que seu pacote substitui outro (monorepos, forks internos). Use com parcimônia e testes.Fluxos recomendados
Desenvolvimento
1 2 3
composer install composer require vendor/pacote composer update vendor/pacote --with-all-dependencies
CI/Produção
1
composer install --no-dev --prefer-dist --optimize-autoloader
Quando abrir PR de atualização
- Rode testes,
composer audit
,composer outdated
. - Liste majors/minors com link do changelog.
- Explique riscos e plano de rollback
Troubleshooting rápido
- Memória:
COMPOSER_MEMORY_LIMIT=-1 composer update
- Proxy: exporte
HTTP_PROXY
/HTTPS_PROXY
- Platform: ajuste
config.platform.php
- Solver: use
why/why-not
, reduza versões rígidas, atualize transientes