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

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


当前回答

要将包作为开发依赖项保存到package.json,请执行以下操作:

npm install "$package" --save-dev

运行npm install时,它将同时安装devDependencies和dependencies。要避免安装devDependencies,请运行:

npm install --production

其他回答

从属关系项目需要运行的依赖项,如提供从代码调用的函数的库。它们是以过渡方式安装的(如果A依赖于B依赖于C,则在A上安装npm将安装B和C)。示例:lodash:您的项目调用一些lodash函数。

devDependencies您只需要在开发或发布过程中使用的依赖项,例如将代码编译为javascript、测试框架或文档生成器的编译器。它们不是以过渡方式安装的(如果A依赖于B,则dev依赖于C,npm安装在A上将只安装B)。示例:grut:您的项目使用grut来构建自己。

对等依赖关系项目在父项目中挂钩或修改的依赖项,通常是其他库或工具的插件。这只是一个检查,确保父项目(将依赖于您的项目的项目)依赖于您所连接的项目。因此,如果你制作了一个插件C,将功能添加到库B中,那么制作项目a的人需要依赖于B,如果他们依赖于C。未安装它们(除非npm<3),只检查它们。示例:grut:您的项目为grut添加了功能,并且只能用于使用grut的项目。

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

此外,随着时间的推移,npm文档得到了改进,现在对不同类型的依赖关系有了更好的解释:https://github.com/npm/cli/blob/latest/docs/content/configuring-npm/package-json.md#devdependencies

重要行为差异总结:

依赖项安装在以下两者上:从包含package.json的目录安装npmnpm在任何其他目录上安装$packagedevDependencies是:也安装在npm上,安装在包含package.json的目录上,除非您传递--production标志(向上投票Gayan Charih的答案),或者设置了NODE_ENV=生产环境变量不安装在npm上,请在任何其他目录上安装“$package”,除非您为其提供--dev选项。未过渡安装。对等依赖关系:3.0之前版本:如果缺少,则始终安装,如果不同的依赖项将使用多个不兼容版本的依赖项,则会引发错误。预计从3.0开始(未经测试):如果在npm安装中缺失,则发出警告,您必须自己手动解决依赖关系。运行时,如果缺少依赖项,则会出现一个错误(由@nextgentech提到)。这很好地解释了这一点:https://flaviocopes.com/npm-peer-dependencies/在版本7中,除非存在无法自动解决的上游依赖关系冲突,否则将自动安装对等依赖关系传递性(Ben Hutchison提到):依赖项是以过渡方式安装的:如果A需要B,B需要C,那么C就会安装,否则,B无法工作,A也无法工作。devDependencies未以过渡方式安装。例如,我们不需要测试B来测试A,因此可以忽略B的测试依赖项。

此处未讨论的相关选项:

bundledDependencies,这是在以下问题上讨论的:在npm中,bundledDepdependencies比普通依赖项的优势可选依赖性(Aidan Feldman提到)

devDependencies

依赖项需要运行,devDependencies只需要开发,例如:单元测试、CoffeeScript到JavaScript转换、缩小等。。。

如果要开发包,请下载它(例如通过gitclone),转到包含package.json的根目录,然后运行:

npm install

因为您有实际的源代码,所以很明显您想要开发它,所以默认情况下,还安装了依赖项(当然,您必须运行才能开发)和devDependency依赖项。

但是,如果您只是一个最终用户,只想安装一个软件包来使用它,您可以从任何目录执行以下操作:

npm install "$package"

在这种情况下,您通常不需要开发依赖项,所以您只需要获得使用包所需的东西:依赖项。

如果您真的想在这种情况下安装开发包,可以将dev-configuration选项设置为true,可能在命令行中为:

npm install "$package" --dev

默认情况下,该选项为false,因为这种情况不太常见。

对等依赖关系

(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/

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

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

对等依赖关系的一个典型例子是Grunt、主机及其插件。

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

咕哝是同伴的依赖唯一的需求('runt')正在测试中/:程序实际上没有使用它。

然后,当用户使用插件时,他将通过添加grunt.loadNpmTasks('grunt-contrib-glify')行从Gruntfile中隐式地请求插件,但用户将直接调用它。

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

手册

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

关键一行是:

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

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

Default: false
Type: Boolean

Install dev-dependencies along with packages.

简言之

依赖项-npm-install<package>--save-prod在生产环境中安装应用程序所需的包。DevDependencies-npm install<package>--保存dev安装仅本地开发和测试所需的软件包只需键入npm install即可安装包.json

因此,如果您正在本地计算机上工作,只需键入npm install并继续:)

要将包作为开发依赖项保存到package.json,请执行以下操作:

npm install "$package" --save-dev

运行npm install时,它将同时安装devDependencies和dependencies。要避免安装devDependencies,请运行:

npm install --production

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

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