题 npm package.json文件中依赖项,devDependencies和peerDependencies之间有什么区别?


这个文件 很难回答我的问题。我不明白这些解释。有人可以用简单的话说吗?也许有例子,如果难以选择简单的单词?


1466
2017-09-18 14:57


起源


注意也有 optionalDependencies 现在。 - Aidan Feldman
@AidanFeldman“optionalDependencies”是我当天的矛盾 - Nick Bull


答案:


重要行为差异摘要:

  • dependencies 安装在两个:

    • npm install 从包含的目录 package.json
    • npm install $package 在任何其他目录上
  • devDependencies 是:

    • 还安装了 npm install 在包含的目录上 package.json,除非你通过了 --production 国旗(去upvote Gayan Charith的回答)。
    • 没安装 npm install "$package" 在任何其他目录上,除非你给它 --dev 选项。
    • 没有传递安装。
  • peerDependencies

    • 在3.0之前:如果丢失则始终安装,如果不同依赖项将使用多个不兼容的依赖版本,则引发错误。
    • 预计从3.0开始 (未经测试):如果失踪则发出警告 npm install,你必须自己手动解决依赖。运行时,如果缺少依赖项,则会出现错误(由...提及) @nextgentech
  • 传递性(由...提及) 本哈奇森):

    • dependencies 传递性安装:如果A需要B,而B需要C,则安装C,否则B不能工作,A也不会。

    • devDependencies 没有传递安装。例如。我们不需要测试B来测试A,因此可以省略B的测试依赖性。

相关选项未在此处讨论:

devDependencies

dependencies 需要运行, devDependencies 只开发,例如:单元测试,Coffeescript到Javascript翻译,缩小,...

如果您要开发包,请下载它(例如通过 git clone),转到其中包含的根 package.json,并运行:

npm install

由于您拥有实际的源代码,因此很明显您要开发它,因此默认情况下都是如此 dependencies (因为你当然必须开发)和 devDependency 依赖项也已安装。

但是,如果您只是想要安装程序包以使用它的最终用户,您可以从任何目录执行:

npm install "$package"

在这种情况下,您通常不需要开发依赖项,因此您只需获得使用该软件包所需的内容: dependencies

如果你真的想在这种情况下安装开发包,你可以设置 dev 配置选项 true,可能来自命令行:

npm install "$package" --dev

选项是 false 默认情况下,这是一个不太常见的情况。

peerDependencies

(3.0之前测试)

资源: https://nodejs.org/en/blog/npm/peer-dependencies/

使用常规依赖项,您可以拥有多个版本的依赖项:它只是安装在 node_modules依赖。

例如。如果 dependency1 和 dependency2 两者都依赖 dependency3 在不同版本中,项目树将如下所示:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

然而,插件是通常不需要其他包的包,称为 主办 在这种背景下。代替:

  • 插件是必需的 由主持人
  • 插件提供了主机期望找到的标准接口
  • 只有主机将由用户直接调用,因此必须有一个版本的主机。

例如。如果 dependency1 和 dependency2 同行依赖 dependency3,项目树将如下所示:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

即使你从未提及,也会发生这种情况 dependency3 在你的 package.json 文件。

我认为这是一个例子 控制反转 设计模式。

对等依赖的典型示例是Grunt,主机及其插件。

例如,在像Grunt这样的插件上 https://github.com/gruntjs/grunt-contrib-uglify,你会看到:

  • grunt 是一个 peerDependency
  • 唯一的 require('grunt') 在下面 tests/:它实际上并没有被程序使用。

然后,当用户使用插件时,他将隐式地要求插件来自 Gruntfile 通过添加一个 grunt.loadNpmTasks('grunt-contrib-uglify') 线,但是 grunt 用户将直接呼叫。

如果每个插件需要不同的Grunt版本,那么这将不起作用。

手册

我认为该文档很好地回答了这个问题,也许你对节点/其他包管理器的熟悉程度不高。我可能只是理解它,因为我对Ruby bundler有所了解。

关键是:

这些东西将在从包的根目录执行npm链接或npm安装时安装,并且可以像任何其他npm配置参数一样进行管理。有关该主题的更多信息,请参阅npm-config(7)。

然后在npm-config(7)下找到 dev

Default: false
Type: Boolean

Install dev-dependencies along with packages.

1747
2018-02-25 04:25



啊。我看到我误解了。你的答案就像是 npm install package 是一个命令,你用来安装所有非dev依赖的软件包,而不是我现在认为你的意思,这就是'安装名为[package]的软件包',这是我认为它在阅读之前的工作方式。如果我是你,我会编辑说[package-name],它清楚地表明你的意思是'insert-name-here'。 - Tom W
这很棒!我从来没有意识到,但这个答案告诉我,依赖关系vs devDependencies的区别仅适用于你要发布npm包的情况。如果您只是在处理应用程序或站点,那应该不会太重要。谢谢! - jedd.ahyoung
应更新此帖子以反映更改的内容 peerDependencies 即将到来的npm @ 3中的行为。从 blog.npmjs.org/post/110924823920/npm-weekly-5:“我们将不再自动下载对等依赖项。相反,如果尚未安装对等依赖项,我们将警告您。这需要您自己手动解决peerDependency冲突,但从长远来看,这应该使你不太可能在你的软件包的依赖关系中陷入困境。“ - nextgentech
此外,依赖包不会传递devDependencies。示例:程序包A取决于程序包B.程序包B取决于程序包C,而B也取决于程序包D.如果运行 npm install 从包A,你会得到B和C,但不是D. - Ben Hutchison
@JerilKuruvila我不明白他的意思。区分 dependencies 和 devDependencies 如果您不发布到NPM,也可能有用。例如,您不希望生产配置脚本获取dev依赖项。 - Ciro Santilli 新疆改造中心 六四事件 法轮功


如果您不想安装devDependencies,则可以使用 npm install --production 


363
2017-07-05 10:06



npm install --save是否适用于软件? - Vamsi Pavan Mahesh
npm install将安装所有依赖项。如果要将特定模块添加到package.json,则使用--save标志。例如: - npm install uglify --save会在你的项目文件夹中安装uglify并将uglify添加到project,package.json文件中。 - Gayan Charith
因为我们正在讨论devDependencies,所以可以使用--save-dev将新模块保存为devDependency。示例:npm install uglify --save-dev - Mykaelos
截至下午5点, --save 不再需要选项。如果您执行“npm install my-package”,它会将my-package添加为您的依赖项 package.json 文件。 - Martin Carel


例如,mocha通常是devDependency,因为在生产中测试不是必需的,而express则是依赖。


91
2017-09-18 18:39



我倾向于将测试作为依赖项,因为您可能希望在启动生产服务器之前运行自检 - Rudolf Olah
我建议使用像Hudson或CircleCI这样的持续集成服务来运行您的测试,然后在它们通过时部署到生产中。 - dankohn
测试实际服务器可能仍然是相关的,因为CI服务器可能与prod服务器有某种不同,并且这种差异可能例如是阻止应用启动... - Nicole
@Nicole为什么你的登台服务器配置与你的prod不一样? - Lucas
@Lucas,例如登台服务器通常具有不同的DB,并且位于与prod机器不同的网段中。任何这些都可能是失败的潜在原因。 (当然,取决于您的具体设置和要求。) - Nicole


要将包保存到 的package.json 作为dev依赖项:

npm install "$package" --save-dev

当你跑步 npm install 它会安装两个 devDependencies 和 dependencies。避免安装 devDependencies 跑:

npm install --production

48
2018-01-08 06:41



你也可以使用:npm i -S - Maysara


有些模块和软件包只是开发所必需的,在生产中不需要。就像它说的那样 文件

如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不希望或不需要下载和构建您使用的外部测试或文档框架。在这种情况下,最好在devDependencies哈希中列出这些附加项。


29
2017-09-18 14:59





依赖
项目需要运行的依赖项,例如提供从代码中调用的函数的库。
它们是可传递的安装(如果A依赖于B取决于C,则在A上安装npm将安装B和C)。
示例:lodash:您的项目调用一些lodash函数。

devDependencies
您在开发或发布期间只需要的依赖关系,比如编写代码并将其编译为javascript,测试框架或文档生成器的编译器。
它们没有传递安装(如果A依赖于B dev-依赖于C,则A上的npm安装将仅安装B)。
示例:grunt:您的项目使用grunt构建自己。

peerDependencies
项目在父项目中挂钩或修改的依赖关系,通常是其他库或工具的插件。它只是一个检查,确保父项目(将依赖于您的项目的项目)依赖于您挂钩的项目。因此,如果您创建一个向库B添加功能的插件C,那么创建项目A的人如果对C具有依赖性,则需要依赖于B.
它们未安装(除非npm <3),它们仅被检查。
示例:grunt:您的项目为grunt添加了功能,只能在使用grunt的项目上使用。

本文档非常好地解释了对等依赖: https://nodejs.org/en/blog/npm/peer-dependencies/ 

此外,npm文档已经过一段时间的改进,现在可以更好地解释不同类型的依赖项: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies


18
2017-09-05 17:27





一个简单的解释让我更清楚:

部署应用程序时,需要安装依赖项中的模块,否则您的应用程序将无法运行。 devDependencies中的模块不需要安装在生产服务器上,因为您没有在该计算机上进行开发。 链接


8
2017-09-29 15:36



所以,如果我们正在制作网站和prod版本,所有的libs都会被内联到 vendor.js如果编译的代码被提交到repo中,我们所有的deps应该是dev deps吗?并且它应该被提交,因为你必须编译模块,而不仅仅是安装它是奇怪的(并且测试也在这里,因为子模块的任何变化都可能导致回归)... - Qwertiy
很棒的答案,但有一个问题? Webpack是否可能构建损坏的捆绑包?我的猜测是devDependencies包在产品版本中不起作用, webpack -p 我的意思是。请回答我的问题。 - AmerllicA
如果在生成构建时出现任何问题,则应该以在构建时显示错误的方式设计部署过程,并且不会将损坏的代码推送到生产中(例如,您可以尝试使用Jenkins)。无论如何都不需要在生产服务器上安装Devdependencies。 - Jyoti Duhan


我想在答案中添加我对这些依赖关系解释的看法

  • dependencies 用于在代码库中直接使用,通常最终出现在生产代码中的东西或代码块
  • devDependencies 用于构建过程,帮助您管理最终代码最终结果的工具,第三方测试模块,(例如webpack的东西)

6
2018-02-16 11:40





在尝试分发npm包时,您应该避免使用 dependencies。相反,你需要考虑添加它 peerDependencies 或从中删除 dependencies


0
2017-07-06 12:47