我想知道require和require-dev之间的区别。 作曲家网站并没有很好地解释这两者之间的区别。

我不明白的部分是列出开发这个包所需的包,或运行测试,从Composer官方文档等。


当前回答

关键的区别是Composer只会为“根包”安装require-dev依赖项——运行Composer install的目录。文档将其描述为:

根包是由编写器定义的包。Json在 项目的根目录。它是主要的作曲家。Json,定义你的 项目需求。

…并且require-dev文档指定它是“仅限root”的。

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

因此,如果你在YourProject的require-dev列表中有phpunit,我克隆了YourProject,并在YourProject /目录中运行composer install, composer将把phpunit安装到YourProject /vendor/目录中,因为很可能我在YourProject上做一些开发。作为开发的一部分,我可能想要运行YourProject的测试套件,为此我需要phpunit。

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

您可以使用——dev和——no-dev选项来覆盖这种行为,但是默认行为是基于所关注的包是否是根包。

其他回答

require-dev包是项目工作所不需要的包,不应该包含在项目的生产版本中。

通常,这些包只在开发期间使用,例如phpunit/phpunit。

关键的区别是Composer只会为“根包”安装require-dev依赖项——运行Composer install的目录。文档将其描述为:

根包是由编写器定义的包。Json在 项目的根目录。它是主要的作曲家。Json,定义你的 项目需求。

…并且require-dev文档指定它是“仅限root”的。

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

因此,如果你在YourProject的require-dev列表中有phpunit,我克隆了YourProject,并在YourProject /目录中运行composer install, composer将把phpunit安装到YourProject /vendor/目录中,因为很可能我在YourProject上做一些开发。作为开发的一部分,我可能想要运行YourProject的测试套件,为此我需要phpunit。

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

您可以使用——dev和——no-dev选项来覆盖这种行为,但是默认行为是基于所关注的包是否是根包。

在我看来很清楚:

需要 列出此包所需的包。包裹将不会 除非满足这些要求,否则安装。 require-dev(根) 列出开发此包(1)或运行测试所需的包, 等。只会安装根包的开发需求 如果使用——dev运行安装,或者不使用——no-dev运行更新。

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


1. 用于开发包的包