Qual é a diferença entre as seções require e require-dev em composer.json?

98

Estou começando a usar o composer, conheço tão pouco sobre ele e tenho alguma experiência com desenvolvimento de aplicativos web.

Acabei de passar pelo Nettuts + Tutorial , então tenho uma pergunta básica sobre o compositor.

{
  "require": {
    "laravel/framework": "4.0.*",
    "way/generators": "dev-master",
    "twitter/bootstrap": "dev-master",
    "conarwelsh/mustache-l4": "dev-master"
  },
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "mockery/mockery": "0.7.*"
  },
  "autoload": {
    "classmap": [
      "app/commands",
      "app/controllers",
      "app/models",
      "app/database/migrations",
      "app/database/seeds",
      "app/tests/TestCase.php"
    ]
  },
  "scripts": {
    "post-update-cmd": "php artisan optimize"
  },
  "minimum-stability": "dev"
}
  1. O que quer que apareça em "require-dev"parte, só será baixado e instalado com composer install --dev?
  2. Eu li alguma documentação do compositor, mas ainda não entendo qual é a razão de termos "require-dev"parte? É porque queremos obter uma versão específica do pacote, em vez de sempre obter a versão estável mais recente?
Artesão
fonte
Relacionado: stackoverflow.com/q/16679589/82216
sampablokuper

Respostas:

113

Ambientes Diferentes

Normalmente, o software será executado em ambientes diferentes:

  • development
  • testing
  • staging
  • production

Dependências diferentes em ambientes diferentes

As dependências que são declaradas na requireseção de composer.jsonsão normalmente dependências que são necessárias para executar um aplicativo ou pacote em

  • staging
  • production

ambientes, enquanto as dependências declaradas na require-devseção são normalmente dependências que são necessárias em

  • developing
  • testing

ambientes.

Por exemplo, além dos pacotes usados ​​para realmente executar um aplicativo, podem ser necessários pacotes para desenvolver o software, como:

  • friendsofphp/php-cs-fixer (para detectar e corrigir problemas de estilo de codificação)
  • squizlabs/php_codesniffer (para detectar e corrigir problemas de estilo de codificação)
  • phpunit/phpunit (para conduzir o desenvolvimento usando testes)
  • etc.

Desdobramento, desenvolvimento

Agora, em ambientes developmente testing, você normalmente executaria

$ composer install

para instalar as dependências productione development.

No entanto, em ambientes staginge production, você só deseja instalar dependências que são necessárias para executar o aplicativo e, como parte do processo de implantação, você normalmente executaria

$ composer install --no-dev

para instalar apenas productiondependências.

Semântica

Em outras palavras, as seções

  • require
  • require-dev

indique composerquais pacotes devem ser instalados quando você executa

$ composer install

ou

$ composer install --no-dev

Isso é tudo.

Nota As dependências de desenvolvimento de pacotes dos quais a sua aplicação ou pacote depende nunca serão instaladas

Para referência, consulte:

localheinz
fonte
Eu entendi corretamente, que não importa se eu "implantar" fazendo upload de toda a vendorpasta via FTP?
pilat
2
@pilat Você pode, mas certifique-se de instalar com —no-dev. Além disso, o FTP provavelmente será muito lento.
localheinz
E quanto às dependências que você precisa apenas para construir seu aplicativo? Então, em um pipeline de construção e implantação, gostaria de instalá-los para construir e removê-los novamente antes de implantar. Por exemplo, para minificação, ou transformando LESS / SASS em css. Como você faria isso?
Richard Kiefer
1
@RichardKiefer Algumas pessoas usam phar.io , outras verificam em PHARs, outras usam imagens Docker e também algumas pessoas usam um separado composer.json- consulte por exemplo github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools .
localheinz
Então, você apenas confirmaria o composer.json e bloquearia em seu repo? Não faz mais sentido comprometer tudo e, para implantar, basta puxar o branch master da produção usando git?
mbomb007
61
  1. De acordo com o manual do compositor :

    require-dev (somente root)

    Lista os pacotes necessários para desenvolver este pacote ou executar testes, etc. Os requisitos de desenvolvimento do pacote raiz são instalados por padrão. Ambos installou updatesuportam a --no-devopção que evita que dependências de desenvolvimento sejam instaladas.

    Portanto, a execução composer installtambém baixará as dependências de desenvolvimento.

  2. A razão é bastante simples. Ao contribuir para uma biblioteca específica, você pode querer executar suítes de teste ou outras ferramentas de desenvolvimento (por exemplo, symfony). Mas se você instalar esta biblioteca em um projeto, essas dependências de desenvolvimento podem não ser necessárias: nem todo projeto requer um executor de teste.

Florent
fonte
19

Do site do compositor (é claro o suficiente)

requer #

Lista os pacotes exigidos por este pacote. O pacote não será instalado a menos que esses requisitos possam ser atendidos.

require-dev (somente root) #

Lista os pacotes necessários para desenvolver este pacote ou executar testes, etc. Os requisitos de desenvolvimento do pacote raiz são instalados por padrão. Tanto a instalação quanto a atualização suportam a opção --no-dev que impede a instalação de dependências dev.

Usando require-dev no Composer, você pode declarar as dependências necessárias para o desenvolvimento / teste do projeto, mas não na produção. Quando você faz o upload do projeto para seu servidor de produção (usando git), a require-devparte é ignorada.

Verifique também esta resposta postada pelo autor e esta postagem também.

O alfa
fonte
3
Por favor, me explique por que "way / generators": "dev-master" está na seção "require"? Eu não precisaria mais dele na produção.
Artisan
1
Esta é uma suposição total, mas a única coisa que posso pensar é que, devido ao modo como / geradores são adicionados como um provedor de serviços, se estiver faltando no ambiente de produção, o Laravel não funcionará.
Daniel Hollands
2
A parte Os requisitos de dev do pacote root são instalados por padrão afirma claramente que as dependências de require-dev estão instaladas, mesmo no servidor de produção.
Gemmu
3
A ideia é que você usaria o sinalizador --no-dev na produção.
John Pancoast de
2

seção require Esta seção contém os pacotes / dependências que são melhores candidatos para serem instalados / requeridos no ambiente de produção.

Seção require-dev: Esta seção contém os pacotes / dependências que podem ser usados ​​pelo desenvolvedor para testar seu código (ou para experimentar em sua máquina local e ela não quer que esses pacotes sejam instalados no ambiente de produção).

MKJ
fonte
1

A regra geral é que você deseja pacotes da seção require-dev apenas em ambientes de desenvolvimento (dev), por exemplo, ambiente local.

Os pacotes na seção require-dev são pacotes que ajudam você a depurar o aplicativo, executar testes etc.

No ambiente de teste e produção , você provavelmente deseja apenas pacotes da seção necessária .

Mas de qualquer maneira você pode executar composer install --no-dev e composer update --no-dev em qualquer ambiente, o comando irá instalar apenas pacotes da seção necessária , não de require-dev , mas provavelmente você deseja executar isto apenas na preparação e produção ambientes não locais.

Teoricamente, você pode colocar todos os pacotes na seção de requerimento e nada acontecerá, mas você não deseja desenvolver pacotes no ambiente de produção pelos seguintes motivos:

  1. Rapidez
  2. potencial de expor algumas informações de depuração
  3. etc

Alguns bons candidatos para require-dev são:

"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"

você pode ver o que os pacotes acima estão fazendo e por que não precisa deles na produção.

Veja mais aqui: https://getcomposer.org/doc/04-schema.md

fico7489
fonte