为什么在npm中使用插件的对等依赖?(代码片段)

author author     2023-05-13     341

关键词:

例如,为什么Grunt插件将其对grunt的依赖定义为“对等依赖”?

为什么插件不能将Grunt作为grunt-plug / node_modules中的依赖?

这里描述了对等依赖关系:https://nodejs.org/en/blog/npm/peer-dependencies/

但我真的不明白。

我正在使用AppGyver Steroids,它使用Grunt任务将我的源文件构建到/ dist /文件夹中,以便在本地设备上提供。我在npm和grunt都很新,所以我想完全理解发生了什么。

到目前为止我得到了这个:

[rootfolder] /package.json告诉npm它依赖于用于开发的grunt-steroids npm包:

  "devDependencies": 
    "grunt-steroids": "0.x"
  ,

好的。在[rootfolder]中运行npm install会检测依赖项并在[rootfolder] / node_modules / grunt-steroids中安装grunt-steroids。

Npm然后读取[rootfolder] /node_modules/grunt-steroids/package.json,以便它可以安装grunt-steroids自己的依赖项:

"devDependencies": 
    "grunt-contrib-nodeunit": "0.3.0",
    "grunt": "0.4.4"
  ,
"dependencies": 
    "wrench": "1.5.4",
    "chalk": "0.3.0",
    "xml2js": "0.4.1",
    "lodash": "2.4.1"
  ,
"peerDependencies": 
    "grunt": "0.4.4",
    "grunt-contrib-copy": "0.5.0",
    "grunt-contrib-clean": "0.5.0",
    "grunt-contrib-concat": "0.4.0",
    "grunt-contrib-coffee": "0.10.1",
    "grunt-contrib-sass": "0.7.3",
    "grunt-extend-config": "0.9.2"
  ,

“dependencies”包安装在[rootfolder] / node_modules / grunt-steroids / node_modules中,这对我来说是合乎逻辑的。

没有安装“devDependencies”,我确信这是由npm控制我只是试图使用grunt-steroids,而不是在它上面开发。

但后来我们有了“peerDependencies”。

这些安装在[rootfolder] / node_modules中,我不明白为什么不存在[rootfolder] / node_modules / grunt-steroids / node_modules,以免与其他grunt插件(或其他)冲突?

答案

TL; DR:[1] peerDependencies用于接受消费代码(并且预期由消费代码使用)的依赖关系,而不是未公开的“私有”依赖关系,并且仅是实现细节。

The problem peer dependencies solve

NPM的模块系统是分层的。更简单场景的一大优势是,当你安装一个npm软件包时,该软件包会带来它自己的依赖项,因此它可以开箱即用。

但问题出现在:

  • 您的项目和您正在使用的某个模块都依赖于另一个模块。
  • 这三个模块必须相互通信。

在例子中

假设您正在构建YourCoolProject,并且您正在使用JacksModule 1.0JillsModule 2.0。让我们假设JacksModule也依赖于JillsModule,但是在另一个版本上,比如1.0。只要这两个版本不符合,就没有问题。 JacksModule在表面下方使用JillsModule的事实只是一个实现细节。我们两次捆绑JillsModule,但是当我们获得开箱即用的稳定软件时,这是一个很小的代价。

但是现在如果JacksModule在某种程度上暴露了它对JillsModule的依赖。例如,它接受JillsClass的一个实例......当我们使用库的new JillsClass版本创建一个2.0并将其传递给jacksFunction时会发生什么?一切都会破裂!简单的事情,如jillsObject instanceof JillsClass将突然返回false,因为jillsObject实际上是另一个JillsClass2.0版本的实例。

对等依赖如何解决这个问题

他们告诉npm

我需要这个软件包,但我需要的是项目的一部分版本,而不是我的模块私有版本。

当npm看到您的软件包被安装到没有该依赖项的项目中,或者它具有不兼容的版本时,它将在安装过程中警告用户。

什么时候应该使用对等依赖?

  • 在构建要由其他项目使用的库时,以及
  • 这个库正在使用其他一些库,和
  • 您期望/需要用户也可以使用其他库

常见场景是大型框架的插件。想想Gulp,Grunt,Babel,Mocha等等。如果你编写一个Gulp插件,你希望该插件能够使用与用户项目所使用的相同的Gulp,而不是你自己的私有版本的Gulp。


Annotations

  1. 太长;没看过。用于表示一个人认为太长的文本的简短摘要。
另一答案

我建议你先重新阅读这篇文章。这有点令人困惑,但winston-mail的例子显示了答案原因:

例如,让我们假装winston-mail@0.2.3在其"winston": "0.5.x"对象中指定了"dependencies",因为这是它测试的最新版本。作为应用程序开发人员,您需要最新和最好的东西,所以你查找最新版本的winstonwinston-mail并将它们放在你的package.json中


  "dependencies":   
    "winston": "0.6.2",  
    "winston-mail": "0.2.3"  
    

但现在,运行npm install会导致意外的依赖关系图

├── winston@0.6.2  
└─┬ winston-mail@0.2.3                
  └── winston@0.5.11

在这种情况下,可能有一个包的多个版本会导致一些问题。对等依赖项允许npm开发人员确保用户具有特定模块(在根文件夹中)。但是你的说法是正确的,即描述一个特定版本的软件包会导致使用其他版本的其他软件包出现问题。正如文章所述,这个问题与npm开发人员有关

一条建议:与常规依赖项不同,对等依赖项要求应该是宽松的。您不应将对等依赖项锁定到特定的修补程序版本。

因此,开发人员应该遵循semver来定义peerDependencies。你应该为GitHub上的grunt-steroids包打开一个问题......

在 npm 包中使用对等依赖项

】在npm包中使用对等依赖项【英文标题】:Usingapeerdependencyinnpmpackage【发布时间】:2020-07-0510:46:51【问题描述】:我在一个充满实用功能的npm包中将momentjs列为对等依赖项。这些功能之一使用矩。"peerDependencies":"moment":"2.x.x",以下... 查看详情

如何识别哪些 npm 包只是对等依赖项?

...描述】:我正在尝试从几个项目的package.json文件中删除未使用的包,但我遇到了对等依赖项的问题。有一些工具,例如depcheck,会尝试列出所有“未使用”的包,但它不会区分实际未使用的包和未使用的包,因为它们是对等依 查看详情

为啥 NPM 7.17 不安装我的对等依赖项

...等依赖项【英文标题】:WhydoesNPM7.17notinstallmypeerdependencies为什么NPM7.17不安装我的对等依赖项【发布时间】:2021-08-2823:21:44【问题描述】:我有一个main项目,它依赖于本地文件存储中的包package1。package1peer依赖快递:"name":"package1"... 查看详情

如何处理 npm3 对等依赖冲突

...我只是在guide之后将我的流星项目迁移到1.3,他们建议我使用npmreact包而不是大气一号。当我安装react和react-dom时,我会得到最新版本,即15.0.1但是,我的项目使用的是npm的fixed-data-table,它具有对等依赖项"pe 查看详情

如何修复对等依赖项安装问题

...【发布时间】:2019-11-0608:36:00【问题描述】:我正在尝试使用npm安装react-contenteditable。但是eslint的对等依赖项不允许我安装时出现以下错误。我正在使用Ubuntu18.04LTS操作系统。这是我用来安装react-contenteditable的代码。npm 查看详情

全局安装具有对等依赖关系的 npm 包(package.json 中未提及)

...【发布时间】:2019-05-2206:50:30【问题描述】:我正在尝试使用npm全局安装marktext(在克隆存储库之后):npminstall-gnpmWARNdagre-d3-renderer@0 查看详情

npm

...题,把每个解决问题的代码封装成一个包,这样每次直接使用这个包就可以了。最开始是打包成压缩文件,用时再解压。后来,使用cdn,在项目中引用cdn的地址就可以。但随着项目的成长,功能不断增加,所需要的包,也就是依... 查看详情

npm 错误!如何使用 vue@2.6.14 安装满足对等依赖的编译器-sfc?

】npm错误!如何使用vue@2.6.14安装满足对等依赖的编译器-sfc?【英文标题】:npmERR!Howtoinstallcompiler-sfcthatmeetspeerdependencywithvue@2.6.14?【发布时间】:2021-08-2412:01:12【问题描述】:我的包JSON"devDependencies":"@fortawesome/fontawesome-svg-core":"^1... 查看详情

npm离线包的制作和使用(代码片段)

说明常规情况,node安装依赖库使用npminstall命令安装。它会从互联网上的npm中央仓库中下载对应的包文件。但是在有些情况下需要在没有互联网的情况下安装依赖库,比如有些公司中,开发环境无法直接连接互联网,只... 查看详情

如何使用npm?cnpm又是什么?

...的很多问题,它是Node获得成功的重要原因之一。常见的使用场景有以下几种:允许用户从NPM服务器下载别人编写的第三方包到本地使用。允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。允许用户将自己编写... 查看详情

探讨npm依赖管理之peerdependencies(代码片段)

...就有点陌生,尤其是没有写过npm包插件的同学,比如之前使用grunt自动化工具的相关插件(如grunt-contrib-jasmine等)或者目前基于某个框架的ui组件库等等,这些都是需要对peerDependencies有一定了解的。下面我们就来说说peerDe 查看详情

npm发布myself的插件(代码片段)

...的第一步是先进行登陆,如果不知道有没有登陆过,可以使用:npmwhoami 查看详情

为啥“npm install”告诉我“没有安装你必须自己安装对等依赖项:”?

...t;tellme"noneisinstalledYoumustinstallpeerdependenciesyourself:"?为什么“npminstall”告诉我“没有安装你必须自己安装对等依赖项:”?【发布时间】:2019-12-1911:47:07【问题描述】:我正在 查看详情

安装拉力编码依赖项时未安装 NPM 警告所需的对等依赖项

】安装拉力编码依赖项时未安装NPM警告所需的对等依赖项【英文标题】:NPMwarningrequiredpeerdependencyisnotinstalledwheninstallingrallycodingdependency【发布时间】:2020-05-1216:58:26【问题描述】:安装rallycoding依赖项时出现错误。出现以下警告... 查看详情

npm小结(代码片段)

...odejs打交道的机会越来越多。无论在node应用的开发,还是使用中,包管理都扮演着一个很重要的作用。NPM(nodepackagemanager),作为node的包管理工具,极大地便利了我们的开发工作,很有必要了解一下。NPM是什么NPM(nodepackagemanage... 查看详情

一文搞懂npm--save和--save-dev的区别

...,如Eslint格式化代码工具,是为了在开发代码时使用的更加流畅,代码更加优美,很显然在运行程序时,是不需要用到该依赖的。运行时依赖(–save)Dependencies:运行时依赖就是在运行程序的过程中,需... 查看详情

冲突的对等依赖关系:webpack@4.46.0 npm ERR!节点模块/webpack

...220:47:26【问题描述】:我从github克隆了一个存储库,然后使用npminstall安装了npm包,但出现此错误"devDependencies":"@vue/c 查看详情

如何将 npm 依赖项添加为对等依赖项

】如何将npm依赖项添加为对等依赖项【英文标题】:Howtoaddnpmdependencyaspeerdependency【发布时间】:2020-07-2116:31:27【问题描述】:npm是否可以选择将依赖项安装为对等依赖项,例如yarn选项--yarn,而不是手动添加例如:"peerDependencies":... 查看详情