协慌网

登录 贡献 社区

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

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

答案

重要行为差异摘要:

  • dependencies安装在两者上:

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

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

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

    • 传递dependencies地安装dependencies :如果 A 需要 B,而 B 需要 C,则安装 C,否则 B 无法工作,A 也不会。

    • devDependencies不是可传递的。例如,我们不需要测试 B 来测试 A,因此可以省略 B 的测试依赖性。

相关选项未在此处讨论:

devDependencies

运行时需要dependenciesdevDependencies只用于开发,例如:单元测试,Coffeescript 到 Javascript 的编译,缩小,...

如果你要开发一个包,你下载它(例如通过git clone ),转到它的包含package.json root,然后运行:

npm install

由于您拥有实际的源代码,因此很明显您要开发它,因此默认情况下,两个dependencies (因为您必须运行以进行开发)和devDependency依赖项也会被安装。

但是,如果您只是想要安装程序包以使用它的最终用户,您可以从任何目录执行:

npm install "$package"

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

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

npm install "$package" --dev

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

peerDependencies

(3.0 之前测试)

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

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

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

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

然而,插件是通常不需要其他包的包,在此上下文中称为主机 。代替:

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

例如,如果dependency1dependency2 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 则是依赖。