Composer é um gerenciador de pacotes no nível do aplicativo para a linguagem de programação PHP, que fornece um formato padrão para gerenciar dependências do software PHP e bibliotecas necessárias. Para quem trabalha com a linguagem, Composer é “A” ferramenta.
Ele foi desenvolvido por Nils Adermann e Jordi Boggiano, em março de 2012. A dupla continua a gerenciar o projeto e acaba de anunciar o lançamento da versão 2.0 do Composer, oito anos depois da versão original.
Então, vale a pena mexer em time que está ganhando? A resposta é “sim”. Composer 2.0 está ainda melhor e seus autores mostraram as melhorias para o público e como é fácil atualizar sua versão agora.
Novidades
A lista de mudanças realizadas no Composer 2.0 é bastante extensa. Entretanto, os desenvolvedores devem estar atentos nesses tópicos: performance, determinismo aplicado na arquitetura de instalação e atualização, tempo de execução melhorado e relatórios de erro. Existem também algumas mudanças na forma como pacotes podem ser atualizados e esse novo sistema tem tudo para ser uma mão na roda nos seus projetos.
Performance
De acordo com Jordi Boggiano, “revisamos quase tudo, desde o protocolo usado entre o Composer e packagist.org até a resolução de dependências, incluindo o download de arquivos em paralelo usando curl”.
O resultado de todo esse trabalho é uma melhoria expressiva em termos de velocidade e utilização de memória, chegando a obter ganhos de 50% na eficiência desses recursos de acordo com as características de cada projeto.
Tome-se por exemplo aqueles projetos que exigem atualizações parciais ou operações de require/remove. Eles passam a ser muito mais velozes com o Composer 2.0, a partir do momento em que a nova versão carrega somente os metadados dos pacotes que estão sendo alterados.
Determinismo
Em Composer 2.0, a própria forma como as dependências são trabalhadas internamente foi alterada. As atualizações passam agora a seguir critérios determinísticos, ou seja, “o estado local atual do diretório do fornecedor não interferirá mais nas atualizações”.
Para o desenvolvimento de um projeto, isso significa que, tão logo uma atualização seja realizada, o processo de instalação é automático, executando todas as operações de rede interligadas primeiro (e com paralelismo, se possível). Isso evita aquele cenário em que acontece um erro de conexão no meio do processo de instalação e o pacote fica parcialmente atualizado.
Tempo de execução
“Adicionamos uma etapa de verificação de plataforma quando vendor/autoload.php é inicializado, o que verifica se a versão e as extensões atuais do PHP correspondem ao que é esperado por suas dependências e causa uma falha de outra forma”, explica Boggiano.
Essa não é a única mudança no tempo de execução do gerenciador de pacotes e a documentação completa oficial vale uma leitura atenta. Entretanto, seus próprios criadores chamam a atenção para uma nova classse: Composer\InstalledVersions, que é carregada automaticamente em cada projeto e disponível já em tempo de execução, verificando quais pacotes e versões estão presentes no seu projeto.
Relatórios de erros
Tentar descobrir o que está dando certo em uma instalação ou projeto é sempre uma fonte de dores de cabeça, principalmente quando lidamos com diferentes bibliotecas, pacotes e componentes de fornecedores diferentes. Felizmente, Composer 2.0 vai facilitar ainda mais na tarefa de identificar quais dependências estão oferecendo problemas, a partir de um robusto relatório de erros.
A expectativa dos seus criadores é que as mensagens agora sejam “mais curtas, mais claras e menos repetitivas”.
Atualizações parciais
Composer 2.0 veio para responde um velho dilema: como atualizar (ou fazer um downgrade) de um único pacote de toda uma instalação para aquela versão específica sem mexer em todo o resto?
Agora, basta usar o comando update –with vendor/package:1.0.*. para executar uma atualização somente daquele pacote daquele fornecedor específico. Desta forma também não é necessário atualizar o composer.json e tampouco é obrigatório marcar aquele arquivo como desatualizado.
Como atualizar para o Composer 2.0
O processo de migrar para o Composer 2.0 não é nenhum bicho de sete cabeças. Na verdade, é bem simples mesmo e o objetivo era esse: facilitar para que todos os usuários aproveitem as mudanças sem preocupações.
Basta executar o comando composer self-update a partir de qualquer versão 1.x. O próprio Composer irá avisar que uma nova versão estável está disponível. Ou você pode utilizar o comando composer self-update –2 e migrar automaticamente para a nova versão.
Em caso de problemas ou caso seu projeto ou ambiente de trabalho precise impreterivelmente da versão anterior, a reversão também é bastante simples, basta executar o comando composer self-update –1. Entretanto, é importante frisar que a versão 1.x do Composer será descontinuada em breve e não receberá mais suporte.
Compatibilidade
O maior obstáculo para começar a usar o Composer 2.0 na verdade pode ser o suporte a projetos antigos. Felizmente, seus desenvolvedores tomaram todas as medidas necessárias para assegurar a compatibilidade com o ecossistema já existente:
- Composer 2.0 ainda oferece suporte a PHP 5.3 (e superior).
- Arquivos do tipo composer.lock são intercambiáveis entre versões, permitindo que o desenvolvedor faça o upgrade para o Composer 2.0 e faça um rollback da mesma forma, se houver necessidade.
- A vasta maioria dos comandos e parâmetros permanecem idênticos, sem necessidade de se aprender quase nada novo.
É possível forçar o uso do Composer 2.0 através de um pacote virtual para instalar os pacotes que você criar. Basta utilizar o comando composer-runtime-api”: “^2.0” no arquivo composer.json.
Por outro lado, há detalhes que podem gerar falhas durante o processo de atualização e desenvolvedores devem estar atentos para:
- Plugins: é impossível controlar todo um ecossistema de terceiros e os plugins devem se tornar uma fonte de dor de cabeça no futuro. Cada criador deve ser responsável pela atualização de seu plugin para ter suporte ao Composer 2.0. Se o plugin não estiver atualizado, então a ferramenta irá acusar falha em suas dependências.
- Prioridade do repositório: houve uma mudança na regra de carregamento. “Se um pacote existe em um repositório de prioridade mais alta, ele agora será totalmente ignorado em repositórios de prioridade mais baixa”. Essa nova regra pode gerar pacotes perdidos, então é importante estar atento às prioridades do repositório em sua sua documentação.
- Configurações inválidas de PSR-0 / PSR-4: o Composer 1.10 emitia alertas, porém a nova versão não fará mais o carregamento automático dessas configurações inválidas. Certifique-se de limpar esses erros antes da atualização.
É bom lembra que agora existe o recurso de checagem de plataforma do novo Composer, que verifica a versão do PHP que está em execução assim como suas extensões disponíveis para comparar com as dependências do projeto. Mensagens de erro devem aparecer nesse momento se não houver paridade entre os recursos.
Para contornar todos os obstáculos que possam surgir nesse momento de atualização, os criadores do Composer 2.0 disponibilizaram uma documentação de upgrade destinada a criadores de plugins, administradores e usuários avançados.
O futuro do Composer
Foram oito anos para se chegar até o Composer 2.0 e ele está vindo repleto de novidades. Portanto, seus desenvolvedores não tem, nesse momento, planos para o futuro da ferramenta em termos de novas funcionalidades. Entretanto, isso não significa que ele está finalizado.
Uma das principais preocupações com a nova versão foi manter a máxima compatibilidade com a anterior e isso inclui suporte ao arcaico PHP 5.3. Essa versão da linguagem de programação está em seu fim de suporte e será abandonada em breve pelas versões posateriores do próprio Composer.
Os desenvolvedores garantem que, por exemplo. Composer 2.1 ainda trará suporte ao PHP 5. Porém, a partir do Composer 2.2, será adotado o PHP 7.1.3 como versão mínima exigida para operar o gerenciador de pacotes. É uma evolução natural para toda a plataforma, com tempo de sobra para desenvolvedores adaptarem seus projetos.
Isso significa também que o Composer 1.x tampouco terá uma vida longa. Correções críticas serão produzidas se houver necessidade, mas os usuários são fortemente encorajados a fazer a migração o mais rápido possível.
Nas palavras finais de Jordi Boggiano, “quero agradecer a todos que contribuíram e ajudaram a tornar isso uma realidade. A versão 2.0 representa mais de 1100 commits de 28 pessoas, mais de 150 problemas do GitHub e solicitações de pull, além de todos que testaram, revisaram PRs, etc. Foi um grande esforço”.