重要行为差异摘要:
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 则是依赖。