重要行为差异摘要:
dependencies
安装在两者上:
npm install
从包含package.json
的目录npm install
npm install $package
在任何其他目录上npm install $package
package.json
的目录上的npm install
上,除非你传递--production
标志(go upvote Gayan Charith 的回答 )。 npm install "$package"
,除非你给它--dev
选项。 npm install
上缺少则发出警告,并且您必须自己手动解决依赖关系。运行时,如果缺少依赖项,则会出现错误(由@nextgentech提及) 及物性( Ben Hutchison提到):
传递dependencies
地安装dependencies
:如果 A 需要 B,而 B 需要 C,则安装 C,否则 B 无法工作,A 也不会。
devDependencies
不是可传递的。例如,我们不需要测试 B 来测试 A,因此可以省略 B 的测试依赖性。
相关选项未在此处讨论:
bundledDependencies
在以下问题中讨论: bundledDependencies 优于 NPM 中的正常依赖关系 optionalDependencies
( Aidan Feldman提到) 运行时需要dependencies
, devDependencies
只用于开发,例如:单元测试,Coffeescript 到 Javascript 的编译,缩小,...
如果你要开发一个包,你下载它(例如通过git clone
),转到它的包含package.json
root,然后运行:
npm install
由于您拥有实际的源代码,因此很明显您要开发它,因此默认情况下,两个dependencies
(因为您必须运行以进行开发)和devDependency
依赖项也会被安装。
但是,如果您只是想要安装程序包以使用它的最终用户,您可以从任何目录执行:
npm install "$package"
在这种情况下,您通常不需要开发依赖项,因此您只需获得使用该软件包所需的内容: dependencies
。
如果您确实想在这种情况下安装开发包,可以将dev
config 选项设置为true
,可能从命令行设置为:
npm install "$package" --dev
默认情况下该选项为false
,因为这是一种不太常见的情况。
(3.0 之前测试)
资料来源: https : //nodejs.org/en/blog/npm/peer-dependencies/
使用常规依赖项,您可以拥有多个版本的依赖项:它只是安装在依赖项的node_modules
中。
例如,如果dependency1
和dependency2
都dependency3
于不同版本的dependency3
,那么项目树将如下所示:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
然而,插件是通常不需要其他包的包,在此上下文中称为主机 。代替:
例如,如果dependency1
和dependency2
peer 依赖于dependency3
,项目树将如下所示:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
即使您从未在package.json
文件中提及dependency3
,也会发生这种情况。
我认为这是控制反转设计模式的一个实例。
对等依赖的典型示例是 Grunt,主机及其插件。
例如,在像https://github.com/gruntjs/grunt-contrib-uglify这样的 Grunt 插件上,您将看到:
grunt
是一个peerDependency
require('grunt')
正在tests/
:它实际上并没有被程序使用。 然后,当用户使用插件时,他将通过添加grunt.loadNpmTasks('grunt-contrib-uglify')
行隐式地要求Gruntfile
的插件,但是用户将直接调用它是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 install --production
例如,mocha 通常是 devDependency,因为在生产中测试不是必需的,而 express 则是依赖。