有没有办法为 package.json 中的相同依赖项指定不同的路径?

Posted

技术标签:

【中文标题】有没有办法为 package.json 中的相同依赖项指定不同的路径?【英文标题】:Is there a way to specify different paths for the same dependencies in package.json? 【发布时间】:2021-10-31 22:29:06 【问题描述】:

我正在开发一个 npm 包,其中包含一个 example 目录来运行/测试实际的包。在example 目录中,我使用"file:.." 包含了父包。

这在开发和频繁更改父包时效果很好,但如果我想将 example 用作独立应用程序,我需要指向实际的 npm 包。

有没有办法在同一个package.json 中有“2 个配置”:

指向 `"file:.." 用于本地开发的文件 一个指向 npm 包以用作独立应用程序的应用程序

这样可以避免重复example 目录

【问题讨论】:

【参考方案1】:

您可以使用 lerna 这是一个单一存储库 CLI 工具。

首先,您必须在同一个存储库中定义多个项目。 Lerna 将这些项目称为“包”,并将它们全部存储在 /packages 文件夹中。

package.json
/packages 
  /my1stPackage
      package.json
  /my2ndPackage   
      package.json

Lerna 有各种优化,我不会在这里深入探讨。但是有一些基础知识:

要初始安装所有 repos 的所有依赖项,请运行 lerna bootstrap --hoist。 您仍然可以像以前一样运行npm run ...,但这些引用您的根package.json 文件。要为特定的子包运行 npm 脚本,您应该运行 lerna run <args> -scope=<packageName>。 (例如lerna run build --scope=my1stPackage

您可以在根 /package.json 脚本部分为此添加快捷方式。

"scripts": 
  "setup": "lerna bootstrap --hoist",
  "build:my1stPackage": "lerna run build --scope=my1stPackage"

您最感兴趣的是,兄弟包可以从它们特定的package.json相互引用,以将彼此包含为依赖关系。

所以,让我们假设my1stPackage 使用my2ndPackage。在my1stPackagepackage.json 文件中会有类似

"dependencies": 
  ...
  "my2ndPackage": "^0.0.1"

my2ndPackage 实际上可以是一个在 npm 中发布的包。但是(!)在本地开发时,lerna 会在/packages/my1stPackage/node_modules/my2ndPackage 内添加一个符号链接,它指向/packages/my2ndPackage 的文件夹。 (这确实适用于所有相关的操作系统。)

package.json 对于本地开发和通过 npm 下载你的包的人看起来是一样的。但是,使用此符号链接解决此问题的是您的 lerna 设置。

【讨论】:

【参考方案2】:

我发现了两种可能的方法:

npm link:https://docs.npmjs.com/cli/v7/commands/npm-link/ npm 工作区:https://docs.npmjs.com/cli/v7/using-npm/workspaces

但在我的具体情况下,有些包可能会在父包和子(示例)包之间发生冲突。

我找不到使它工作的可靠方法,并决定更简单的方法是简单地创建一个单独的存储库,其中包含 example 目录的独立版本和可以保留它的脚本与原始存储库中的“主示例”保持同步。这种方式可以保持快速开发,并且“示例副本”很容易保持最新,而无需复制代码。

【讨论】:

以上是关于有没有办法为 package.json 中的相同依赖项指定不同的路径?的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 package.json 中的 npm 脚本 [重复]

从 package-lock.json 创建 package.json

有没有办法在不安装包的情况下按字母顺序排列 package.json?

有没有办法在 package.json 中分叉一个 npm 库并在安装时运行它的构建过程?

使用 shell 脚本提取 package.json 版本

在 nx 构建/部署上生成 package.json