O Composer tem a opção de carregar várias dependências apenas enquanto estiver em desenvolvimento, para que as ferramentas não sejam instaladas na produção (no servidor ativo). Isso é (em teoria) muito útil para scripts que só fazem sentido no desenvolvimento, como testes, ferramentas de dados falsos, depurador etc.
O caminho a seguir é adicionar um require-dev
bloco adicional com as ferramentas necessárias no dev:
"require-dev": {
"codeception/codeception": "1.6.0.3"
}
e depois (teoricamente) carregue essas dependências via
composer install --dev
Problema e pergunta:
O Composer mudou dramaticamente o comportamento de install
e, update
em 2013, as require-dev
dependências agora estão instaladas por padrão (!), Sinta-se à vontade para criar um composer.json com um require-dev
bloco e execute um composer install
para reproduzir.
Como a maneira mais aceita de implantar é empurrar o compositor. lock (que mantém sua configuração atual do compositor) e, em seguida, executa um composer install
no servidor de produção, isso também instalará o material de desenvolvimento.
Qual é a maneira correta de implantar isso sem instalar as dependências -dev?
Nota: Estou tentando criar uma pergunta / resposta canônica aqui para esclarecer a implantação estranha do Composer. Sinta-se livre para editar esta pergunta.
fonte
composer.lock
nunca deve ser adicionado ao repositório Git, NUNCA. A abordagem correta é usar a atualização do compositor na preparação e sincronizar o arquivo na produção (se tudo funcionar, é claro). A preparação deve ser a cópia exata de um ambiente de produção.composer.lock
deve fazer parte.gitignore
.Respostas:
Por quê
Há IMHO uma boa razão para o Composer usar a
--dev
bandeira por padrão (na instalação e atualização) hoje em dia. O compositor é executado principalmente no cenário em que este é o comportamento desejado:O fluxo de trabalho básico do Composer é o seguinte:
composer.phar install --dev
:, json e arquivos de bloqueio são confirmados no VCS.composer.phar install --dev
.composer.phar require <package>
adicione--dev
se desejar o pacote narequire-dev
seção (e confirme).composer.phar install --dev
.composer.phar update --dev <package>
(e confirmação).composer.phar install --dev
.composer.phar install --no-dev
Como você pode ver o
--dev
sinalizador é usado (muito) mais do que o--no-dev
sinalizador, especialmente quando o número de desenvolvedores trabalhando no projeto aumenta.Implantação de produção
Bem, o arquivo
composer.json
ecomposer.lock
deve estar comprometido com o VCS. Não omitacomposer.lock
pois contém informações importantes sobre as versões do pacote que devem ser usadas.Ao executar uma implementação de produção, você pode passar o
--no-dev
sinalizador para o Composer:O
composer.lock
arquivo pode conter informações sobre pacotes dev. Isso não importa. o--no-dev
sinalizador garantirá que esses pacotes dev não estejam instalados.Quando digo "implantação de produção", quero dizer uma implantação destinada a ser usada na produção. Não estou discutindo se isso
composer.phar install
deve ser feito em um servidor de produção ou em um servidor intermediário, onde as coisas podem ser revisadas. Esse não é o escopo desta resposta. Estou apenas apontando comocomposer.phar install
instalar as dependências "dev".Fora do assunto
O
--optimize-autoloader
sinalizador também pode ser desejável na produção (ele gera um mapa de classe que acelerará o carregamento automático no seu aplicativo):Ou quando a implantação automatizada for concluída:
Se a sua base de código suporta, você pode trocar
--optimize-autoloader
para--classmap-authoritative
. Mais informações aquifonte
--optimize-autoloader
. Considere também--classmap-authoritative
- Na documentação aqui, getcomposer.org/doc/03-cli.md, você pode ver o seguinte: "Carregar automaticamente classes apenas do mapa de classes. Ativa implicitamente --optimize-autoloader" para que você possa usar se conhecer as classes " there ", o que provavelmente deve acontecer em seu ambiente de prod, a menos que você gere classes dinamicamente.optimize-autoloader
direta nocomposer.json
:{"config": { "optimize-autoloader": true } }
Na verdade, eu recomendo CONTRA a instalação de dependências no servidor de produção.
Minha recomendação é fazer check-out do código em uma máquina de implantação, instalar dependências conforme necessário (isso inclui NÃO instalar dependências de desenvolvimento se o código for produzido) e depois mover todos os arquivos para a máquina de destino.
Por quê?
composer install
Resumindo: use o Composer em um ambiente que você possa controlar. Sua máquina de desenvolvimento está qualificada porque você já possui todas as coisas necessárias para operar o Composer.
O comando a ser usado é
Isso funcionará em qualquer ambiente, seja o próprio servidor de produção ou uma máquina de implantação ou a máquina de desenvolvimento que deve fazer uma última verificação para descobrir se algum requisito de desenvolvedor é usado incorretamente para o software real.
O comando não instalará ou desinstalará ativamente os requisitos de desenvolvimento declarados no arquivo composer.lock.
Se você não se importa de implantar componentes de software de desenvolvimento em um servidor de produção, a execução
composer install
faria o mesmo trabalho, mas simplesmente aumentaria a quantidade de bytes movimentados e também criaria uma declaração maior do carregador automático.fonte
app-1.34.phar
etc). Há um mecanismo separado que é notificado e decide quando pegar esse arquivo, para onde transferi-lo e o que fazer com ele. Algumas equipes optam por descompactar o phar uma vez que está no servidor e algumas equipes o executam como estão. Isso deu muita confiança à estabilidade e à reprodutibilidade de nossas implantações.Agora
require-dev
está ativado por padrão, para desenvolvimento local, você pode fazercomposer install
ecomposer update
sem a--dev
opçãoQuando você deseja implantar na produção, verifique se
composer.lock
não possui nenhum pacote provenienterequire-dev
.Você pode fazer isso com
Depois de testar localmente,
--no-dev
você pode implantar tudo na produção e instalação com base nocomposer.lock
. Você precisa da--no-dev
opção novamente aqui, caso contrário, o compositor dirá "O arquivo de bloqueio não contém informações requer-dev" .Nota: Tenha cuidado com qualquer coisa que possa introduzir diferenças entre dev e produção! Geralmente, tento evitar o require-dev sempre que possível, pois incluir ferramentas de desenvolvimento não é uma grande sobrecarga.
fonte
composer.lock
dependências de desenvolvimento. Você simplesmente executariacomposer install --no-dev
e obteria apenas as dependências regulares instaladas - na verdade, o Composer também removerá todas as dependências de desenvolvimento nesta etapa.composer.lock
tivesse dependências de dev (e potencialmente afetasse as versões dos pacotes não-dev), eu gostaria de atualizá-lo para refletir como seria na produção. Isso também força você a executar acomposer install --no-dev
produção, comocomposer install
ocorrerá um erro. Tecnicamente, acho que você está certo; isso não é necessário, mas é um nível extra de segurança, do que eu gosto.dev/tool
eprod/lib:~1.0
. O mais recente prod / lib é 1.3, mas o dev / tool também exigeprod/lib:1.1.*
. Resultado: você instalará a versão 1.1.9 (a mais nova da ramificação 1.1.x) e a utilizará durante o seu desenvolvimento. Eu diria que NÃO é seguro atualizar apenas--no-dev
, portanto, inclua o mais recente prod / lib 1.3 e assuma que tudo funciona sem teste. E talvez o teste seja impossível por causa da falta de dev / tool. Eu diria que, como o dev / tool não é necessário na produção, ele não deve ser lançado, mas o software deve usar o prod / lib 1.1.9.--no-dev
, precisará testá-lo localmente, como mencionei na resposta. Eu ainda recomendaria não usar--no-dev
nada.composer update
:, faça algum desenvolvimento,composer update --no-dev
faça o teste de lançamento, empurre para produção e façacomposer install --no-dev
. Dois problemas: 1. Não consigo testar o lançamento sem dependências de desenvolvimento e 2. Não consigo instalar o Git, por exemplo, em produção.Nos servidores de produção, renomeio
vendor
paravendor-<datetime>
, e durante a implantação terá dois diretórios de fornecedores.Um cookie HTTP faz com que meu sistema escolha o novo fornecedor
autoload.php
e, após o teste, faço uma alternância totalmente atômica / instantânea entre eles para desativar o diretório antigo do fornecedor para todas as solicitações futuras e, em seguida, excluo o diretório anterior alguns dias depois.Isso evita qualquer problema causado pelos caches do sistema de arquivos que estou usando no apache / php e também permite que qualquer código PHP ativo continue usando o diretório do fornecedor anterior.
Apesar de outras respostas recomendarem, eu pessoalmente corro
composer install
no servidor, pois é mais rápido que o rsync da minha área de preparação (uma VM no meu laptop).Eu uso
--no-dev --no-scripts --optimize-autoloader
. Você deve ler os documentos de cada um para verificar se isso é apropriado em seu ambiente.fonte
Eu acho que é melhor automatizar o processo:
Adicione o arquivo composer.lock no seu repositório git, certifique-se de usar o composer.phar install --no-dev ao liberar, mas na sua máquina dev você poderia usar qualquer comando do compositor sem preocupações, isso não irá para a produção. a produção baseará suas dependências no arquivo de bloqueio.
No servidor, você faz o check-out dessa versão ou etiqueta específica e executa todos os testes antes de substituir o aplicativo, se os testes passarem, você continuará a implantação.
Se o teste depender das dependências do desenvolvedor, pois o compositor não possui uma dependência do escopo do teste, uma solução não muito elegante pode ser executada com as dependências do desenvolvedor ( instalação do composer.phar ), remova a biblioteca do fornecedor, execute o compositer.phar install - -no-dev novamente, isso usará dependências em cache, portanto é mais rápido. Mas isso é um truque, se você conhece o conceito de escopos em outras ferramentas de construção
Automatize isso e esqueça o resto, vá beber uma cerveja :-)
PS .: Como no comentário do @Sven abaixo, não é uma boa ideia não fazer check-out do arquivo composer.lock, porque isso fará com que a instalação do compositor funcione como atualização do compositor.
Você pode fazer essa automação com http://deployer.org/ , é uma ferramenta simples.
fonte
composer.lock
farácomposer install
agir comocomposer update
. Portanto, as versões que você implanta não são as que você desenvolveu. É provável que isso gere problemas (e mais ainda à luz do único problema de segurança resolvido recentemente com "replace" no Composer). Você nunca deve executarcomposer update
autônoma sem verificar se não quebrou nada.