Fornece uma alternativa mais segura para composer global require
.
O Cgr tem sido usado em ambientes do mundo real há vários anos; no entanto, consulte a fila de problemas e 'Limitações' abaixo.
O comando global require
do Composer é uma técnica de instalação recomendada para muitas ferramentas de linha de comando PHP; entretanto, os usuários que instalam ferramentas dessa forma correm o risco de encontrar falhas de instalação causadas por conflitos de dependência entre diferentes projetos. O script cgr se comporta de forma semelhante ao composer global require
, usando composer require
para instalar uma cópia global por usuário de uma ferramenta de linha de comando, mas em um local isolado que não experimentará conflitos de dependência com outras ferramentas instaladas globalmente.
O script cgr não está relacionado à segurança; não é mais nem menos seguro do que instalar via compositor global require.
O próprio Composer recomenda composer global require
como um comando de "conveniência" para instalar ferramentas de linha de comando. Infelizmente, esta recomendação está em desacordo com a suposição básica do Composer, que é a de que as dependências de cada projeto devem ser gerenciadas de forma independente. O comando global
do Composer cria um único projeto "global"; projetos instalados via composer global require
serão todos instalados neste local e suas dependências serão todas mescladas. Isso significa que podem surgir conflitos entre dois projetos independentes que nunca foram projetados para funcionarem juntos e não precisam que suas dependências sejam combinadas em um único autoloader. Quando esse tipo de situação surge, muitas vezes é muito difícil para os iniciantes diagnosticarem.
Este script, chamado cgr
, tem o nome de "composer global require", o comando do Composer que ele emula. Ele oferece um mecanismo de substituição para instalação global de ferramentas de linha de comando PHP que é funcionalmente equivalente (quase) ao comando existente, mas muito mais seguro. O script Cgr criará um diretório separado para cada projeto instalado; por padrão, o local de instalação é ~/.composer/global/org/project
. Quaisquer scripts binários listados no arquivo compositor.json do projeto instalado serão instalados no diretório bin padrão do Composer, ~/.composer/vendor/bin
.
Como o script cgr não possui dependências próprias, é seguro instalá-lo por meio do comando global require
do Composer:
composer global require consolidation/cgr
Se ainda não tiver feito isso, você também precisará adicionar o vendor/bin
do diretório inicial do Composer ao seu $PATH. Depois disso, você pode substituir cgr
por qualquer ferramenta de linha de comando cujas instruções de instalação recomendem o uso do Composer global require
.
Para adicionar o diretório bin correto ao seu PATH:
PATH="$(composer config -g home)/vendor/bin:$PATH"
Exemplo:
cgr drush/drush
Ao contrário do comando compositor global require, é possível usar cgr para definir a estabilidade mínima para um projeto antes de instalá-lo. Isso é feito da mesma maneira que o comando composer create-project
:
cgr --stability RC pantheon-systems/terminus 1.0.0-alpha2
O comportamento do script cgr pode ser personalizado com opções de linha de comando e variáveis de ambiente.
Opção | Variável de ambiente | Descrição |
---|---|---|
--composer-path | CGR_COMPOSER_PATH | O caminho para o binário do Composer. |
--base-dir | CGR_BASE_DIR | Onde armazenar projetos "globais". |
--bin-dir | CGR_BIN_DIR | Onde instalar os binários do projeto. |
Se essas variáveis não estiverem definidas, então cgr usa o valor da variável de ambiente COMPOSER_HOME
como o diretório base a ser usado conforme descrito na documentação do Composer sobre variáveis de ambiente.
Para configurar o cgr para instalar binários em ~/bin, adicione o seguinte ao seu arquivo ~/.bashrc:
export CGR_BIN_DIR=$HOME/bin
Você pode selecionar qualquer diretório que desejar para CGR_BIN_DIR
, desde que esteja em seu $PATH.
Para exibir as informações de um projeto, execute:
cgr info drush/drush
Para exibir as informações de todos os projetos instalados via ‘cgr’, execute:
cgr info
Para atualizar um projeto instalado com cgr
, execute:
cgr update drush/drush
Para atualizar tudo instalado pelo cgr
, execute:
cgr update
Para remover um projeto:
cgr remove drush/drush
Para atualizar ou remover o próprio cgr, execute composer global update consolidation/cgr
ou composer global remove cgr
. Observe que a remoção do cgr não afeta os comandos instalados com o cgr; eles permanecerão instalados e funcionais.
Se você achar que cgr
ainda está se comportando como um comando global require
padrão do Composer, verifique novamente as configurações da sua variável $PATH e use which cgr
e alias cgr
para determinar se este script está ou não sendo selecionado pelo seu shell. É possível que o cgr entre em conflito com alguma outra ferramenta; por exemplo, o projeto oh-my-zsh define um alias cgr. Se isso for um problema para você, unalias cgr
ou talvez adicione alias cgrx="$HOME/.composer/vendor/bin/cgr"
para executar esta ferramenta experimental como cgrx
.
O Composer também carregará os plug-ins do Composer do projeto "global" do Composer. Isso é raro; entretanto, se desejar instalar um instalador do Composer globalmente, você deverá usar o comando composer global require
diretamente. O script cgr isola os projetos que instala uns dos outros para evitar possíveis conflitos entre dependências; esse isolamento também torna qualquer plug-in do Composer indisponível no contexto global.
O script cgr mantém a conveniência de gerenciar automaticamente o local de instalação global para você; entretanto, se isso não for desejado, você pode simplesmente executar comandos semelhantes a:
COMPOSER_BIN_DIR=$HOME/bin composer require org/project:~1.0
Se você seguir esse caminho, precisará configurar seu local de instalação manualmente usando mkdir
e cd
conforme necessário antes de executar composer require
. Você não pode simplesmente definir COMPOSER_BIN_DIR globalmente, pois isso faria com que os binários dos projetos locais fossem instalados em seu diretório bin global, o que, obviamente, não seria desejável.
Em um script de Integração Contínua, a seguinte construção é útil:
/usr/bin/env COMPOSER_BIN_DIR=$HOME/bin composer --working-dir=$HOME/project require org/project:~1.0
Altere o diretório de instalação ( $HOME/project
) para corresponder ao projeto que está sendo instalado, para que cada projeto seja instalado em seu próprio local separado.
O plugin Composer bamarni/composer-bin-plugin oferece uma maneira semelhante de gerenciar a instalação isolada de ferramentas binárias, definindo locais de instalação nomeados separados. Isso oferece uma maneira conveniente de instalar vários projetos juntos (por exemplo, instalar o Robo junto com projetos externos, fornecendo tarefas adicionais do Robo em um projeto 'robo').
Espera-se que esta ferramenta seja uma solução provisória, até que alterações no Composer a tornem desnecessária. Consulte o problema do Composer para atualizações.