132

我开始使用composer,我对此知之甚少,并且对Web应用程序开发有一点经验。

我只是浏览了Nettuts+ 教程,所以我有关于作曲家的基本问题。

{
  "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"一部分的原因是什么?是因为我们想获得特定版本的软件包而不是总是获得最新的稳定版本吗?
4

6 回答 6

173

不同的环境

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

  • development
  • testing
  • staging
  • production

不同环境下的不同依赖

require部分中声明的composer.json依赖项通常是运行应用程序或包所需的依赖项

  • staging
  • production

环境,而该require-dev部分中声明的依赖项通常是在

  • developing
  • testing

环境。

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

  • friendsofphp/php-cs-fixer(检测和修复编码风格问题)
  • squizlabs/php_codesniffer(检测和修复编码风格问题)
  • phpunit/phpunit(使用测试驱动开发)
  • 等等

部署

现在,在developmenttesting环境中,您通常会运行

$ composer install

安装productiondevelopment依赖项。

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

$ composer install --no-dev

仅安装production依赖项。

语义

换句话说,这些部分

  • require
  • require-dev

指示composer运行时应安装哪些软件包

$ composer install

或者

$ composer install --no-dev

就这些。

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

供参考,请参阅:

于 2017-08-17T13:01:15.577 回答
63
  1. 根据作曲家手册

    需要开发(仅限根)

    列出开发此包或运行测试等所需的包。默认安装根包的开发要求。两者installupdate支持--no-dev阻止安装开发依赖项的选项。

    所以运行composer install也会下载开发依赖。

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

于 2013-10-01T15:52:48.537 回答
22

从作曲家网站(很清楚)

要求#

列出此包所需的包。除非满足这些要求,否则不会安装该软件包。

需要开发(仅限根)#

列出开发此包或运行测试等所需的包。默认安装根包的开发要求。install 或 update 都支持阻止安装开发依赖项的 --no-dev 选项。

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

还要检查作者发布的这个答案和这篇文章

于 2013-10-01T15:53:11.040 回答
3

要求部分 本部分包含在生产环境中安装/需要的更好的候选包/依赖项。

require-dev 部分:此部分包含开发人员可以用来测试她的代码(或在她的本地机器上进行实验并且她不希望将这些包安装在生产环境中)的包/依赖项。

于 2017-10-06T08:49:46.627 回答
2

一般规则是您只需要在开发(开发)环境中使用require-dev部分的包,例如本地环境。

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

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

但无论如何,您可以在任何环境中运行composer install --no-devcomposer update --no-dev,该命令将只安装来自required部分的包,而不是来自require-dev,但您可能只想在登台生产时运行它环境不在本地。

从理论上讲,您可以将所有包放在require部分并且什么都不会发生,但是您不希望在生产环境中开发包,原因如下:

  1. 速度
  2. 暴露一些调试信息的可能性
  3. ETC

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

于 2018-08-01T06:56:46.547 回答
0

注意require-dev(仅限root)

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

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

于 2020-09-21T11:37:10.053 回答