在 package.json 中有没有办法为相同的依赖项指定不同的路径?
Is there a way to specify different paths for the same dependencies in package.json?
我正在开发一个 npm 包,其中包含 example
目录到 run/test 实际包。在 example
目录中,我使用 "file:.."
.
包含了父包
这在开发和频繁更改父包时工作正常,但如果我想将 example
用作独立应用程序,我需要指向实际的 npm 包。
有没有办法在同一个 package.json
:
中有“2 个配置”
- 一个指向 `"file:.." 的本地开发
- 指向 npm 包以用作独立应用程序的一个
这将避免复制 example
目录
我发现了两种可行的方法:
npm link
: https://docs.npmjs.com/cli/v7/commands/npm-link/
- npm 工作空间:https://docs.npmjs.com/cli/v7/using-npm/workspaces
但在我的具体情况下,有些包可能会在父包和子包(示例)之间发生冲突。
我找不到一种可靠的方法来让它工作,因此决定更简单的方法是简单地创建一个单独的存储库,其中包含一个独立版本的 example
目录和一个脚本可以使它与原始存储库中的“主示例”保持同步。这样开发可以保持快速,并且“示例副本”很容易保持最新而无需复制代码。
您可以使用 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
。在 my1stPackage
的 package.json
文件中会有类似
的内容
"dependencies": {
...
"my2ndPackage": "^0.0.1"
}
my2ndPackage
实际上可能是一个在 npm 中发布的包。然而 (!) 在本地开发时,lerna 将在 /packages/my1stPackage/node_modules/my2ndPackage
中添加一个符号 link,它指向 /packages/my2ndPackage
的文件夹。 (这确实适用于所有相关操作系统。)
你 package.json
对于本地开发和通过 npm 下载你的包的人来说看起来是一样的。但是,您的 lerna 设置使用此符号 link.
修复了此问题
我正在开发一个 npm 包,其中包含 example
目录到 run/test 实际包。在 example
目录中,我使用 "file:.."
.
这在开发和频繁更改父包时工作正常,但如果我想将 example
用作独立应用程序,我需要指向实际的 npm 包。
有没有办法在同一个 package.json
:
- 一个指向 `"file:.." 的本地开发
- 指向 npm 包以用作独立应用程序的一个
这将避免复制 example
目录
我发现了两种可行的方法:
npm link
: https://docs.npmjs.com/cli/v7/commands/npm-link/- npm 工作空间:https://docs.npmjs.com/cli/v7/using-npm/workspaces
但在我的具体情况下,有些包可能会在父包和子包(示例)之间发生冲突。
我找不到一种可靠的方法来让它工作,因此决定更简单的方法是简单地创建一个单独的存储库,其中包含一个独立版本的 example
目录和一个脚本可以使它与原始存储库中的“主示例”保持同步。这样开发可以保持快速,并且“示例副本”很容易保持最新而无需复制代码。
您可以使用 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
。在 my1stPackage
的 package.json
文件中会有类似
"dependencies": {
...
"my2ndPackage": "^0.0.1"
}
my2ndPackage
实际上可能是一个在 npm 中发布的包。然而 (!) 在本地开发时,lerna 将在 /packages/my1stPackage/node_modules/my2ndPackage
中添加一个符号 link,它指向 /packages/my2ndPackage
的文件夹。 (这确实适用于所有相关操作系统。)
你 package.json
对于本地开发和通过 npm 下载你的包的人来说看起来是一样的。但是,您的 lerna 设置使用此符号 link.