npm package.json文件中依赖关系,devDependencies和peerDependencies之间有什么区别?

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

编辑还添加了peerDependencies ,这是密切相关的,可能会造成混乱。

重要的行为差异总结:

  • dependencies安装在两个:

    • npm install从包含package.json的目录npm install
    • npm install $package在任何其他目录上npm install $package
  • devDependencies是:

    • 也安装在npm install在一个包含package.json的目录中,除非你传递--production标志(去提高Gayan Charith的回答 )。
    • 没有在npm install "$package"在任何其他目录上,除非你给它的--dev选项。
    • 没有安装传输。
  • peerDependencies

    • 3.0之前:总是安装,如果缺less,并提出一个错误,如果多个不兼容的版本的依赖将由不同的依赖使用。
    • 预期从3.0开始 (未经testing):如果在npm install上丢失,则给出警告,并且您必须手动解决依赖关系。 运行时,如果依赖项丢失,则会出现错误(由@nextgentech提及)
  • 传递性( Ben Hutchison提到):

    • dependencies是以传递方式安装的:如果A需要B,B需要C,那么C被安装,否则B不能工作,A也不会。

    • devDependencies不是可传递安装的。 例如,我们不需要testingB来testingA,所以B的testing依赖性可以被省略。

这里没有讨论相关选项:

  • 在下面的问题上讨论了bundledDependencies : BundPubDependencies相对于NPM中的正常依赖的优点
  • optionalDependencies 依赖 ( 由Aidan Feldman提到)

devDependencies

dependencies是需要运行, devDependencies只开发,例如:unit testing,Coffeescript Javascript转译,缩小,…

如果你打算开发一个包,你可以下载它(例如通过git clone ),进入包含package.json根目录,然后运行:

 npm install 

既然你有实际的源代码,显然你想开发它,所以默认情况下,这两个dependencies (因为你必须运行开发)和devDependency依赖关系也被安装。

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

 npm install "$package" 

在这种情况下,您通常不需要开发依赖关系,因此您只需获取使用该包所需的东西: dependencies

如果你真的想在这种情况下安装开发包,你可以设置devconfiguration选项为true ,可能从命令行为:

 npm install "$package" --dev 

该选项默认为false ,因为这是一个不太常见的情况。

peerDependencies

(3.0之前testing)

来源: https : //nodejs.org/en/blog/npm/peer-dependencies/ – http://blog.nodejs.org/2013/02/07/peer-dependencies/

使用常规的依赖关系,您可以拥有多个版本的依赖关系:它只是安装在依赖关系的node_modules中。

例如,如果dependency1dependency2dependency3于不同版本的dependency3 ,项目树将如下所示:

 root/node_modules/ | +- dependency1/node_modules/ | | | +- dependency3 v1.0/ | | +- dependency2/node_modules/ | +- dependency3 v2.0/ 

然而,插件是通常不需要其他软件包的软件包,在这种情况下称为主机 。 代替:

  • 主机需要插件
  • 插件提供了主机希望find的标准接口
  • 只有主机才会被用户直接调用,所以必须有一个版本的主机。

例如,如果dependency1dependency2 peer依赖dependency3 ,项目树将如下所示:

 root/node_modules/ | +- dependency1/ | +- dependency2/ | +- dependency3 v1.0/ 

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

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

同伴依赖的典型例子是Grunt,主机及其插件。

例如,在像https://github.com/gruntjs/grunt-contrib-uglify这样的Grunt插件上,你会看到:;

  • gruntpeerDependency
  • 唯一的require('grunt')正在tests/ :它并没有被程序实际使用。

然后,当用户使用插件时,他会通过添加一个grunt.loadNpmTasks('grunt-contrib-uglify')行隐式地要求Gruntfile的插件,但是用户直接调用会很grunt.loadNpmTasks('grunt-contrib-uglify')

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

手册

我认为doc很好地回答了这个问题,也许你对节点/其他软件包pipe理者不够熟悉。 我可能只理解它,因为我知道一些关于Ruby捆绑器。

关键是:

这些东西将在安装npm link或npm install时从根目录安装,并且可以像其他npmconfiguration参数那样进行pipe理。 有关该主题的更多信息,请参见npm-config(7)。

然后在npm-config(7)下finddev

 Default: false Type: Boolean Install dev-dependencies along with packages. 

如果你不想安装devDependencies,你可以使用npm install --production

例如,摩卡通常是devDependency,因为在生产中testing不是必须的,而express是一个依赖。

作为开发依赖项保存到package.json中:

 npm install "$package" --save-dev 

当你运行npm install ,会同时安装devDependenciesdependencies ,以避免安装devDependencies运行:

 npm install --production 

有些模块和软件包只是开发所必需的,而这些模块和软件包在生产中是不需要的。 就像它在文档中说的那样:

如果有人计划在他们的程序中下载和使用你的模块,那么他们可能不想或者不需要下载和构build你使用的外部testing或者文档框架。 在这种情况下,最好在devDependencies哈希中列出这些附加项。

依赖
您的项目需要运行的依赖关系,如提供您从代码调用的函数的库。
他们被安装(如果A取决于B取决于C,npm安装在A将安装B和C)。
例如:lodash:你的项目调用一些lodash函数。

devDependencies
在开发或者发布的时候,你只需要依赖你的代码,比如编译器把你的代码编译成javascript,testing框架或者文档生成器。
它们不是以传输方式安装的(如果A取决于B dev-取决于C,则n上的npm安装将只安装B)。
例如:grunt:你的项目使用grunt来构build自己。

peerDependencies
您的项目在父项目中挂钩或修改的依赖项通常是其他库或工具的插件。 这只是一个检查,确保父项目(取决于你的项目的项目)依赖于你钩入的项目。 所以,如果你制作一个插件C,为库B添加function,那么有人做项目A需要依赖于B,如果他们有依赖C.
他们没有安装(除非npm <3),他们只被检查。
例子:grunt:你的项目增加了grunt的function,只能用在使用grunt的项目上。

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

而且,随着时间的推移npm文档已经得到了改进,现在更好地解释了不同types的依赖: https : //github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies

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

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