提问者:小点点

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


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

EDIT还添加了PeerDependencies,这两者密切相关,可能会引起混淆。


共3个答案

匿名用户

重要行为差异汇总:

>

  • 依赖项安装在两者上:

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

    DevDependencies是:

    • 也安装在包含package.json目录的npm install上,除非您传递--production标志(转到投票给Gayan Charith的答案)。
    • 未安装在npm上在任何其他目录上安装“$package”,除非您为其提供--dev选项。
    • 不是以传递方式安装的。

    对等依赖项:

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

    及物性(Ben Hutchison提到):

    >

  • dependencies是可传递地安装的:如果A需要B,而B需要C,则安装C,否则,B不能工作,A也不能工作。

    DevDependencies未以传递方式安装。例如。我们不需要测试B来测试A,因此可以省略B的测试依赖项。

    此处未讨论的相关选项:

    • bundledDependencies讨论了以下问题:NPM中bundledDependencies
    • 中bundledDependencies的优点
    • optionaldependencies(由Aidan Feldman提到)

    dependencies需要运行,devdependencies仅用于开发,例如:单元测试,CoffeeScript到JavaScript转换,缩小等。

    如果您要开发一个包,可以下载它(例如通过Git Clone),转到包含package.json的根目录,然后运行:

    npm install
    

    由于您有了实际的源,很明显您想要开发它,因此默认情况下,也安装了dependencies(因为您当然必须运行才能开发)和devdependency依赖项。

    但是,如果您只是一个最终用户,只想安装一个软件包来使用它,那么您可以从任何目录执行以下操作:

    npm install "$package"
    

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

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

    npm install "$package" --dev
    

    默认情况下,该选项为false,因为这种情况非常少见。

    (3.0之前测试)

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

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

    例如。如果Dependency1Dependency2都依赖于不同版本的Dependency3,则项目树如下所示:

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

    然而,插件是通常不需要另一个包的包,在此上下文中,另一个包称为主机。取而代之的是:

    • 主机需要插件
    • 插件提供主机希望找到的标准界面
    • 用户只会直接调用主机,因此主机必须有一个版本。

    例如。如果Dependency1Dependency2对等体依赖于Dependency3,则项目树如下所示:

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

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

    我认为这是控制反转设计模式的一个实例。

    对等依赖的一个典型例子是Grunt,主机和它的插件。

    例如,在类似https://github.com/gruntjs/grunt-contrib-uglify的Grunt插件上,您将看到:

    • grunt对等依赖
    • 唯一的要求('grunt')测试/下:程序实际上没有使用它。

    然后,当用户使用插件时,他将通过添加gruntfile行隐式地要求grunt.loadnpmtasks('grunt-contrib-uglify')中的插件,但用户将直接调用的是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安装--生产

    匿名用户

    例如,mocha通常是一个devDependency,因为在生产中不需要测试,而express则是一个依赖项。