这个文档很难回答我的问题。我不明白那些解释。有人能用更简单的话说吗?如果很难选择简单的词,可以举例说明
EDIT还添加了peerDependencies
,这是密切相关的,可能会引起混淆
重要行为差异总结:
-
依赖项
安装在以下两个系统上:npm安装
从包含package.json的目录
npm在任何其他目录上安装$package
-
devdependency
是:- 也安装在包含
package.json
的目录下的npm安装
,除非您通过--production
标志(向上投票Gayan Charith的答案) - 未安装在
npm安装"$一揽子计划在任何其他目录上,除非您为其提供了
--dev
选项 - 不是通过传递方式安装的
- 也安装在包含
-
peerDependencies
:- 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中,bundledDependencies比普通依赖性的优势optionalDependencies
(艾丹·费尔德曼提到)
依赖性
依赖项
需要运行,依赖项
仅用于开发,例如:单元测试、CoffeeScript到JavaScript的转换、缩小
如果要开发软件包,请下载(例如通过git clone
),转到包含package.json
的根目录,然后运行:
npm安装
由于您拥有实际的源代码,很明显您想要开发它,因此默认情况下,还安装了依赖项
(当然,您必须运行才能开发)和devDependency
依赖项
但是,如果您只是一个只想安装软件包以使用它的最终用户,您可以从任何目录执行以下操作:
npm安装"$一揽子计划;
在这种情况下,您通常不需要开发依赖项,因此您只需要获得使用包所需的:依赖项
如果您确实希望在这种情况下安装开发包,可以将dev
配置选项设置为true
,可能可以从命令行设置为:
npm安装"$一揽子计划--发展
默认情况下,该选项为false
,因为这是一种不太常见的情况
对等依赖
(在3.0之前测试)
资料来源:https://nodejs.org/en/blog/npm/peer-dependencies/
对于常规依赖项,您可以有多个版本的依赖项:它只需安装在依赖项的节点模块
中
例如,如果dependency1
和dependency2
都依赖于不同版本的dependency3
,则项目树将如下所示:
根/节点模块/
|
+-从属1/节点\单元模块/
| |
|+-dependency3 v1.0/
|
|
+-依赖性2/节点\单元模块/
|
+-依赖性3 v2.0/
然而,插件是通常不需要另一个包的包,在本文中称之为主机。相反:
- 主机需要插件
- 插件提供了主机希望找到的标准接口
- 只有主机将被用户直接调用,因此必须有一个单一版本的主机
例如,如果dependency1
和dependency2
对等依赖dependency3
,项目树将如下所示:
根/节点模块/
|
+-依赖性1/
|
+-依赖性2/
|
+-依赖关系3 v1.0/
即使在package.json
文件中从未提及dependency3
,也会发生这种情况
我认为这是控制反转设计模式的一个例子
对等依赖的一个典型例子是Grunt、主机及其插件
例如,在Grunt插件上,例如https://github.com/gruntjs/grunt-contrib-uglify,你会看到:
grunt
是一种对等依赖关系
- 唯一的
require('grunt')
正在tests/
:程序实际上没有使用它
然后,当用户使用插件时,他将通过添加grunt.loadNpmTasks('grunt-contrib-uglify')
行隐式地从Gruntfile
中请求插件,但用户将直接调用grunt
如果每个插件都需要不同的Grunt版本,那么这将不起作用
手册
我认为文档很好地回答了这个问题,也许您对节点/其他包管理器不够熟悉。我可能只理解它,因为我对Ruby bundler了解一点
关键是:
这些东西将在从包的根目录执行npm链接或npm安装时安装,并且可以像任何其他npm配置参数一样进行管理。有关此主题的更多信息,请参阅npm配置(7)
然后在npm配置(7)下查找dev
:
默认值:false
类型:布尔型
随软件包一起安装开发人员依赖项。