npm package.json 文件中的依赖项、devDependencies 和 peerDependencies 有什么区别?

问题描述

重要行为差异总结:

  • dependencies都安装在:
  • npm install从包含package.json
  • npm install $package在任何其他目录上
  • devDependencies是:
  • 也安装在npm install包含 的目录上package.json,除非您通过--production标志。
  • 没有安装在npm install "$package"任何其他目录上,除非你给它--dev选项。
  • 不会传递安装。
  • peerDependencies:
  • 3.0 之前:如果缺少,则始终安装,如果不同的依赖项将使用多个不兼容版本的依赖项,则会引发错误。
  • 预计从 3.0 开始(未经测试):如果缺少 on 则发出警告npm install,您必须自己手动解决依赖关系。运行时,如果缺少依赖项,则会出现错误(@nextgentech提到)这很好地解释了它:https ://flaviocopes.com/npm-peer-dependencies/
  • 在版本 7 中peerDependencies 会自动安装,除非存在无法自动解决的上游依赖冲突
  • 传递性(Ben Hutchison提到):
  • dependencies传递安装:如果 A 需要 B,B 需要 C,则安装 C,否则,B 不能工作,A 也不能工作。
  • devDependencies没有传递安装。例如,我们不需要测试 B 来测试 A,因此可以省略 B 的测试依赖项。

开发依赖

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/

但是,插件是通常不需要其他包的包,在此上下文中称为主机。反而:

  • 主机需要插件
  • 插件提供主机期望找到的标准接口
  • 只有主机会被用户直接调用,所以它必须只有一个版本。

例如,如果dependency1dependency2peer 依赖dependency3,项目树将如下所示:

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

即使您从未dependency3package.json文件中提及,也会发生这种情况。

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

对等依赖的一个典型例子是 Grunt、主机和它的插件。

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

  • grunt是一个peer-dependency
  • 唯一require('grunt')的是tests/:它实际上并没有被程序使用。

然后,当用户使用插件时,他会Gruntfile通过添加grunt.loadNpmTasks('grunt-contrib-uglify')一行来隐式地要求插件,但这grunt是用户将直接调用的。

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

手动的

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

关键线是:

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

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

Default: false
Type: Boolean

Install dev-dependencies along with packages.

解决方法

有人能用更简单的话说吗?如果很难选择简单的单词,也许有例子?

EDIT还添加了peerDependencies,这是密切相关的,可能会引起混淆。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...