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


99

我开始使用作曲家,对此了解甚少,并且对Web应用程序开发有一点经验。

我只是遍历了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"参与其中的原因是什么?是否因为我们要获取软件包的特定版本而不是始终获取最新的稳定版本?

Answers:


115

不同的环境

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

  • 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

就这些。

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

供参考,请参阅:


我是否正确理解,如果我vendor通过FTP 上传整个文件夹来“部署”,那根本没有关系吗?
彼拉特18-3-6

2
@pilat可以,但是请确保使用进行安装—no-dev。另外,FTP可能会很慢。
localheinz

只需要构建应用程序的依赖项呢?因此,在构建和部署管道中,我想安装它们以进行构建,然后在部署之前再次将其删除。例如进行缩小,或将LESS / SASS转换为CSS。你会怎么做?
理查德·基弗

1
@RichardKiefer有些人使用phar.io,其他人检入PHAR,另一些人使用Docker映像,还有一些人使用单独的composer.json-请参见例如github.com/FriendsOfPHP/PHP-CS-Fixer/tree/2.16/dev-tools
localheinz

那么,您是否只提交composer.json并锁定到您的存储库?提交所有内容不是更有意义,对于部署,只需使用git从生产中拉出master分支?
mbomb007

61
  1. 根据作曲家的手册

    require-dev(仅root用户)

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

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

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


19

在作曲家网站上(很清楚)

要求#

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

require-dev(仅root用户)#

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

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

还要检查作者这个帖子发布的答案。


3
请向我解释为什么“ way / generators”:“ dev-master”位于“ require”部分中?在生产环境中不再需要它。
工匠

1
这是一个总的猜测,但是我唯一能想到的是,因为将方式/生成器添加为服务提供者,所以如果在生产环境中缺少它,Laravel将无法工作。
Daniel Hollands 2013年

2
默认情况下,默认安装了根软件包的dev需求部分,其中指出即使在生产服务器上,也已安装了require-dev的依赖关系。
Gemmu,

3
这个想法是,您将在生产中使用--no-dev标志。
John Pancoast 2015年

2

require部分 此部分包含软件包/依赖项,它们是在生产环境中要安装/要求的更好的候选者。

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


1

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

在包要求-dev的部分是你调试应用程序,它帮助包,运行测试等。

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.