这个文档很难回答我的问题。我不明白那些解释。有人能用更简单的语言说吗?如果很难选择简单的单词,也许可以举例说明?
EDIT还添加了PeerDependencies
,这两者密切相关,可能会引起混淆。
重要行为差异汇总:
>
依赖项
安装在两者上:
NPM从包含package.json
npm在任何其他目录上安装$package
DevDependencies
是:
package.json
目录的npm install
上,除非您传递--production
标志(转到投票给Gayan Charith的答案)。npm上在任何其他目录上安装“$package”
,除非您为其提供--dev
选项。对等依赖项
:
npm install
上缺少,则发出警告,您必须自己手动解决依赖关系。运行时,如果缺少依赖项,则会出现错误(@NextGenTech提到)及物性(Ben Hutchison提到):
>
dependencies
是可传递地安装的:如果A需要B,而B需要C,则安装C,否则,B不能工作,A也不能工作。
DevDependencies
未以传递方式安装。例如。我们不需要测试B来测试A,因此可以省略B的测试依赖项。
此处未讨论的相关选项:
bundledDependencies
讨论了以下问题:NPM中bundledDependenciesoptionaldependencies
(由Aidan Feldman提到)dependencies
需要运行,devdependencies
仅用于开发,例如:单元测试,CoffeeScript到JavaScript转换,缩小等。
如果您要开发一个包,可以下载它(例如通过Git Clone
),转到包含package.json
的根目录,然后运行:
npm install
由于您有了实际的源,很明显您想要开发它,因此默认情况下,也安装了dependencies
(因为您当然必须运行才能开发)和devdependency
依赖项。
但是,如果您只是一个最终用户,只想安装一个软件包来使用它,那么您可以从任何目录执行以下操作:
npm install "$package"
在这种情况下,通常不需要开发依赖项,因此只需要获得使用包所需的内容:dependencies
。
如果您确实希望在这种情况下安装开发包,可以将dev
配置选项设置为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,主机和它的插件。
例如,在类似https://github.com/gruntjs/grunt-contrib-uglify的Grunt插件上,您将看到:
grunt
是对等依赖
要求('grunt')
在测试/
下:程序实际上没有使用它。然后,当用户使用插件时,他将通过添加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.
如果不想安装devDependencies,可以使用NPM安装--生产
例如,mocha通常是一个devDependency,因为在生产中不需要测试,而express则是一个依赖项。