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

Posted

技术标签:

【中文标题】如何识别哪些 npm 包只是对等依赖项?【英文标题】:How do I identify which npm packages are just peer dependencies? 【发布时间】:2020-01-24 17:27:00 【问题描述】:

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

那里有一个包,或者一些我不熟悉的npm 命令,这将允许我列出我的项目中的所有对等依赖项,或者至少允许我输入一个包命名并查看该软件包是否已安装,因为它是另一个软件包的对等依赖项?

为了后代,这里是我的一个项目的依赖项的示例。在这个项目中,我知道reflect-metadata@nestjs/common 的对等依赖项,但我卸载它后才发现。

"dependencies": 
    "@google-cloud/storage": "^3.2.1",
    "@google-cloud/vision": "^1.3.0",
    "@google/maps": "^0.5.5",
    "@nestjs/common": "^6.6.7",
    "@nestjs/core": "^6.6.7",
    "@nestjs/platform-express": "^6.6.7",
    "@slack/webhook": "^5.0.1",
    "@typeform/api-client": "^1.5.1",
    "algoliasearch": "^3.34.0",
    "array-uniq": "^2.1.0",
    "basic-auth": "^2.0.1",
    "child-process-promise": "^2.2.1",
    "class-transformer": "^0.2.3",
    "class-validator": "^0.10.0",
    "express": "^4.17.1",
    "firebase-admin": "^8.5.0",
    "firebase-functions": "^3.2.0",
    "geoip-lite": "^1.3.8",
    "geolib": "^3.0.4",
    "glob": "^7.1.4",
    "hbs": "^4.0.4",
    "hubspot-api": "^2.2.10",
    "json2csv": "^4.5.3",
    "lodash": "^4.17.15",
    "luxon": "^1.17.2",
    "node-fetch": "^2.6.0",
    "postmark": "^2.2.9",
    "promise-settle": "^0.3.0",
    "qrcode": "^1.4.1",
    "redux": "^4.0.4",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^6.5.3",
    "sales-tax": "^2.0.10",
    "sanitize-filename": "^1.6.3",
    "sharp": "^0.23.0",
    "stripe": "^7.9.0"
  ,

【问题讨论】:

请出示您的 package.json 我已经发布了 package.json 中的依赖项 【参考方案1】:

执行npm install 后会有一个名为 package-lock.json 的文件。 通过分析package-lock.json文件,可以了解各个包的依赖关系。 更多详情可以参考this博客。

包的正确运行需要包的依赖项。 但是有一些可选的依赖,可以跳过。 您可以在安装时使用--no-optional 参数,这样就不会安装这些额外的包。 但请确保您的应用程序在没有这些可选包的情况下也能正常工作。

【讨论】:

package-lock.json 不显示对等依赖关系,并且该博客文章甚至不包含“对等”一词【参考方案2】:

check-peer-deps

验证是否满足所有***依赖项的 peerDependency 要求。

安装

你可以在你的系统上安装它:

npm i -g check-peer-deps

请注意,此实用程序需要 npm 可用。

用法

只需切换到您希望检查peerDependencies的项目目录并运行程序。

 cd foobar

 检查-peer-deps

如果满足所有***peerDependencies 的最低版本,则不会有输出,否则您将看到类似以下内容:

check-peer-deps 找不到满足 eslint-config-airbnb-base 的 peerDependency 为 'eslint@^4.9.0' 的依赖关系!当前:eslint@^4.6.0 包依赖能否满足peerDependency?是的

这告诉您 eslint-config-airbnb-base 需要 eslint@^4.9.0 作为 peerDependency,但该项目目前仅指定 eslint@^4.6.0,如果 eslint@4.6 可能会出现问题。 0 已安装且在安装前未更新。输出还告诉您,尽管允许的最低版本太低,但允许的最高版本确实满足 peerDependencies 要求。

install-peers-cli

CLI 安装项目的 peerDependencies,没有副作用。适用于 npm、纱线。支持纱线工作区流。

安装 纱线

$ yarn add --dev install-peers-cli npm

$ npm install --save-dev install-peers-cli

用法 添加 package.json 脚本:

“脚本”: “安装对等体”:“安装对等体”

然后运行 ​​yarn install-peers(或 npm run install-peers)来安装项目的对等依赖项。它不会更新锁定文件或修改 package.json,让您的设置保持纯净。根据您的用例,可以使用任何其他生命周期脚本。

由于 npm/yarn 的安装流程,您仍然可能在常规安装阶段看到“未满足对等依赖关系”的警告。

【讨论】:

这是一个很好的回应,但它没有回答我的问题——我需要知道一个特定的包是否是我项目中其他包的对等依赖项。【参考方案3】:

这是一个很好的问题,不知道为什么它被否决了。 不幸的是,我不知道有一种现有的、自动化程度很高的方法来做到这一点。

您可以像这样测试单个包:

npm uninstall some-package && npm ls

如果有任何对等依赖违规,它们将被打印出来并且命令将退出非零。

因此,您可以将其与提到的其他工具之一的输出结合起来,遍历孤立包的候选者,逐个删除它们,并在每次更改之间测试输出。然后执行npm uninstall --save 来提交没有产生错误的那些,或者npm install 来回滚那些产生错误的。这可以自动化,但我将把它作为练习留给读者。

【讨论】:

以上是关于如何识别哪些 npm 包只是对等依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

在 npm 包中使用对等依赖项

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

为啥在 npm 中为插件使用对等依赖项?

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

package.json 的开放式对等版本依赖项?

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