在 comper.json 中,request 和 request-dev 部分有什么区别?

我开始使用作曲家,我对它所知甚少,并有一点经验与 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"的一部分?是因为我们希望得到特定的 版本的软件包,而不是总是得到最新的稳定版本?
153524 次浏览
  1. 根据 作曲家手册:

    Request-dev (仅根用户)

    列出开发此包或运行测试等所需的包。默认情况下,根包的开发需求是安装的。installupdate都支持防止安装开发依赖项的 --no-dev选项。

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

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

来自作曲家网站(非常清楚)

要求 #

列出此包所需的包。该包将不是 除非能符合有关规定,否则不得安装。

Need-dev (只有 root) #

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

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

也检查这个答案张贴的 作者这篇文章以及。

不同的环境

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

  • development
  • testing
  • staging
  • production

不同环境中的不同依赖

composer.jsonrequire部分中声明的依赖项通常是在

  • 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

仅此而已。

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

有关参考,请参阅:

要求部分 本部分包含生产环境中更适合安装/需要的软件包/依赖项。

Request-dev 部分: 这个部分包含了软件包/依赖项,开发人员可以使用这些软件包/依赖项来测试代码(或者在本地机器上进行试验,但是开发人员不希望这些软件包被安装到生产环境中)。

一般规则是,您只希望在开发(dev)环境(例如本地环境)中使用来自 开发需求部分的包。

开发需求部分的软件包是帮助你调试应用程序、运行测试等的软件包。

表演制作环境中,您可能只需要来自 要求部分的包。

但无论如何,您可以在任何环境中运行 作曲家 install —— no-dev作曲家更新,没有开发人员,command 将只安装来自 需要部分的软件包,而不是来自 开发需求,但是您可能希望只在 表演制作环境中运行这个软件包,而不是在本地环境中。

理论上,你可以把所有的软件包放在 要求部分,什么都不会发生,但是你不想在生产环境中开发软件包,原因如下:

  1. 速度
  2. 可能会暴露一些调试信息
  3. 等等

开发需求的一些优秀候选者是:

"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

注意 Request-dev (仅根用户)

这意味着,只有当您的包是整个项目的根时,开发需求部分才是有效的。也就是说,如果你从你的包文件夹运行 composer update

如果您为某个主项目开发一个插件,该插件有自己的 comper.json,那么您的 开发需求部分将被完全忽略!如果需要开发依赖项,则必须将 开发需求移动到 main 项目中的 poser.json。