npm package.json文件中的依赖项、devdependency和peerdependency之间有什么区别?

这个文档很难回答我的问题。我不明白那些解释。有人能用更简单的话说吗?如果很难选择简单的词,可以举例说明

EDIT还添加了peerDependencies,这是密切相关的,可能会引起混淆

重要行为差异总结:

  • 依赖项安装在以下两个系统上:

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

    • 也安装在包含package.json的目录下的npm安装,除非您通过--production标志(向上投票Gayan Charith的答案)
    • 未安装在npm安装&quot$一揽子计划在任何其他目录上,除非您为其提供了--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安装&quot$一揽子计划;

在这种情况下,您通常不需要开发依赖项,因此您只需要获得使用包所需的:依赖项

如果您确实希望在这种情况下安装开发包,可以将dev配置选项设置为true,可能可以从命令行设置为:

npm安装&quot$一揽子计划--发展

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

对等依赖

(在3.0之前测试)

资料来源:https://nodejs.org/en/blog/npm/peer-dependencies/

对于常规依赖项,您可以有多个版本的依赖项:它只需安装在依赖项的节点模块

例如,如果dependency1dependency2都依赖于不同版本的dependency3,则项目树将如下所示:

根/节点模块/
|
+-从属1/节点\单元模块/
| |
|+-dependency3 v1.0/
|
|
+-依赖性2/节点\单元模块/
|
+-依赖性3 v2.0/

然而,插件是通常不需要另一个包的包,在本文中称之为主机。相反:

  • 主机需要插件
  • 插件提供了主机希望找到的标准接口
  • 只有主机将被用户直接调用,因此必须有一个单一版本的主机

例如,如果dependency1dependency2对等依赖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
类型:布尔型
随软件包一起安装开发人员依赖项。

发表评论