composer.json中require和require-dev部分之间有什么区别?

时间:2013-10-01 13:45:50

标签: composer-php

我开始使用作曲家,我对它知之甚少,对网络应用程序开发有一点经验。

我只是走过Nettuts+ Tutorial,所以我对作曲家有基本的疑问。

{
  "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. 无论“require-dev”部分出现什么,只会下载并安装 composer install --dev
  2. 我读了一些作曲家的文档,但仍然不明白我们有“require-dev”部分的原因是什么?是因为我们希望获得该软件包的特定版本,而不是总是获得最新的稳定版本?

6 个答案:

答案 0 :(得分:67)

不同的环境

通常,软件将在不同的环境中运行:

  • development
  • testing
  • staging
  • production

不同环境中的不同依赖

require的{​​{1}}部分中声明的依赖项通常是在

中运行应用程序或程序包所需的依赖项
  • composer.json
  • staging

环境,而production部分中声明的依赖项通常是

中所需的依赖项
  • require-dev
  • developing

环境。

例如,除了用于实际运行应用程序的软件包之外,可能还需要软件包来开发软件,例如:

  • testing(检测并修复编码样式问题)
  • friendsofphp/php-cs-fixer(检测并修复编码样式问题)
  • squizlabs/php_codesniffer(使用测试推动开发)

部署

现在,在phpunit/phpunitdevelopment环境中,您通常会运行

testing

安装$ composer install production个依赖项。

但是,在developmentstaging环境中,您只想安装运行应用程序所需的依赖项,并且作为部署过程的一部分,您通常会运行

production

仅安装$ composer install --no-dev 个依赖项。

语义

换句话说,部分

  • production
  • require

在运行

时向require-dev表明应安装哪些软件包
composer

$ composer install

就是这样。

注意您的应用程序或程序包所依赖的程序包的开发依赖性永远不会被安装

供参考,见:

答案 1 :(得分:56)

  1. 根据composer's manual

      

    require-dev(仅限root)

         

    列出开发此软件包或运行测试等所需的软件包。默认情况下会安装root软件包的开发人员要求。 installupdate都支持阻止安装dev依赖项的--no-dev选项。

    因此,运行composer install也将下载开发依赖项。

  2. 原因其实很简单。在为特定库做贡献时,您可能希望运行测试套件或其他开发工具(例如symfony)。但是,如果将此库安装到项目中,则可能不需要这些开发依赖项:并非每个项目都需要测试运行器。

答案 2 :(得分:18)

来自作曲家网站(很明显)

  

要求#

     

列出此软件包所需的软件包。包裹不会   安装,除非可以满足这些要求。

     

require-dev(root-only)#

     

列出开发此软件包或运行测试所需的软件包,   通过安装根包的开发需求   默认。安装或更新都支持--no-dev选项   防止安装dev依赖项。

在Composer中使用require-dev,您可以声明开发/测试项目所需的依赖项,但在生产中不需要。当您将项目上传到生产服务器时(使用git)require-dev部分将被忽略。

同时查看authorthis post发布的此答案。

答案 3 :(得分:1)

需要部分 本节包含的软件包/依赖项是生产环境中安装/需要的更好的选择。

require-dev部分:此部分包含开发人员可用于测试其代码的包/依赖项(or for the experiment purpose on her local machine and she wants these packages should not be installed on the production environment.)

答案 4 :(得分:0)

一般规则是,您只希望在开发(dev)环境(例如本地环境)中从 require-dev 部分获得软件包。

require-dev 部分中的软件包是可帮助您调试应用程序,运行测试等的软件包。

登台生产环境中,您可能只需要 require 部分中的软件包。

但是无论如何,您可以在任何环境上运行 composer install --no-dev composer update --no-dev ,该命令将仅安装中的软件包不是来自 require-dev 的“必需” 部分,但是您可能只想在非本地的登台生产环境中运行此文件。

理论上,您可以将所有软件包放在 require 部分中,但不会发生任何事情,但是由于以下原因,您不想在生产环境中开发软件包:

  1. 速度
  2. 暴露一些调试信息的潜力

require-dev 的一些不错的候选人是:

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

您可以看到上面的程序包在做什么,并且会看到为什么在生产中不需要它们。

在此处查看更多信息:https://getcomposer.org/doc/04-schema.md

答案 5 :(得分:0)

请注意 require-dev(仅root用户)

这意味着 require-dev 部分仅在您的软件包是整个项目的根目录时才有效。即如果您从软件包文件夹中运行:id

如果您为某个主项目开发一个具有自己的composer.json的插件,那么您的 require-dev 部分将被完全忽略!如果需要开发依赖项,则必须将 require-dev 移至主项目中的composer.json。