ChatGPT解决这个技术问题 Extra ChatGPT

require 和 require-dev 有什么区别? [复制]

这个问题在这里已经有了答案:composer.json 中的 require 和 require-dev 部分有什么区别? (6 个回答) 4 年前关闭。

我是 composer 的新手,我想知道 requirerequire-dev 之间的区别。作曲家网站没有很好地解释这两者之间的区别。

我没有得到的部分是来自 Composer Official Docs.Lists packages required for developing this package, or running tests, etc.


S
Scott Tesler

require-dev 包是对您的项目运行来说不是必需的包,并且不应包含在您的生产版本中项目。

通常,这些是您只会在开发期间使用的包,例如 phpunit/phpunit


作曲家如何知道它在开发环境中并且应该使用 require-dev
@surfer190 我的理解是作曲家不知道;您需要在实时环境中使用 --no-dev 选项执行 composer install 或 update 以避免安装 dev 包,但我可能错了。
你甚至想让作曲家知道吗?
@surfer190 默认情况下,为您运行 composer install 的包安装“开发”依赖项(作曲家称之为“根包”),但不为作为依赖项安装的其他包安装。
我认为这里真正的问题是“在 require-dev 中有包是否会让 Composer 在 composer update|require 上抱怨 require 中的包?
N
Nathan Craike

主要区别在于 Composer 只会为“根包”安装 require-dev 依赖项 - 您运行 composer install 的目录。 The documentation 将其描述为:

根包是 composer.json 在你的项目根目录下定义的包。它是定义项目需求的主要 composer.json。

…并且 require-dev documentation 指定它是“仅根”。

在实践中,这意味着如果包被安装为其他东西的依赖项(即它被安装到另一个项目的 vendor 文件夹),则不使用包的 require-dev 依赖项。

因此,如果您在 YourProjectrequire-dev 列表中有 phpunit,我克隆 YourProject 并在 yourproject/ 目录中运行 composer install,Composer 将安装phpunityourproject/vendor/,因为我可能正在 YourProject 上进行一些开发。作为开发的一部分,我可能想要运行 YourProject 的测试套件,为此我需要 phpunit

但是,如果我将 YourProject 添加为 MyProject 的依赖项,安装 myproject 包也会安装 yourproject 包,但不会安装phpunit

可以使用 --dev--no-dev options 覆盖此行为,但默认行为取决于相关包是否为 根包


请注意,自发布这些答案以来,其他一些答案引用了 Composer 文档的部分内容。引用的部分已过时。
最清晰的解释在这里,读完这个之后其他的都有意义
很清楚的解释。
c
cyberhicham

对我来说似乎很清楚:

require 列出此包所需的包。除非满足这些要求,否则不会安装该软件包。 require-dev (root-only) 列出开发这个包 (1) 或运行测试等所需的包。根包的 dev 要求只有在 install 使用 --dev 运行或 update 没有运行时才会安装--没有开发。

http://getcomposer.org/doc/04-schema.md

1. 用于开发包的包


目前尚不清楚“这个包”指的是哪个包。
@ScottDavidTesler 这个包您在 composer.json 文件中提供的包,例如 "require-dev": { // this package('s) }
@Dagon谁在乎线程的年龄?人们仍然会关注它,可能会持续很多年。堆栈溢出不是一种普通的论坛,几天后消息就会丢失。
“只有在使用 --dev 运行安装时才会安装根包的开发要求……”这已在链接文档中更改为:“根包的开发要求默认安装。”上述摘录已过时。