我有一个正在开发的项目的lerna repo。它有几个相互依赖的包。为了使开发更容易,不会发布任何包,它们彼此依赖于最新版本。
目录树
foo/
packages/
core/
package.json
errors/
package.json
foo/packages/core/package.json
{
...
dependencies: {
"@foo/errors": "*"
}
}
我还有另一个项目,bar
,我用它来测试lerna项目。目前,我正在使用本地file:
依赖项链接到其依赖项:
bar/package.json
{
...
dependencies: {
"@foo/core": "../foo/packages/core"
}
}
这种方法给我带来了麻烦。
- 使用 npm,我经常受到 ENOENT 的打击。删除错误。删除我的 package-lock.json 并重新安装已经花费了我多年的时间。
- 使用纱线,我一直无法
yarn install
bar
.Yarn遵循file:
依赖关系到@foo/core
,看到它依赖于@foo/errors
,并且不知道lerna的符号链接。这会导致它失败,告诉我它找不到@foo/errors
。
这使得为这个项目编写实际代码成为这种混乱的依赖关系管理的次要工作。
我怎样才能使这个(我觉得相当简单?)项目结构工作?此时开放给lerna/yarn/npm/pnpm/shell scripts/MS DOS。
您应该能够使用npm link
完成此操作。尽管我还没有使用未在 npm 上发布的本地依赖项来尝试此操作。
目录树
foo/
packages/
core/
package.json
errors/
package.json
bar/
package.json
foo/packages/core/package.json
{
...
dependencies: {
"@foo/errors": "*"
}
}
bar/package.json
{
...
dependencies: {
"@foo/core": "../foo/packages/core"
}
}
运行以下命令
cd foo
npx lerna clean
npx lerna bootstrap --hoist
npm run build # command to build your projects
cd packages/core
npm link
cd ../../../bar
npm i
npm link @foo/core
删除 package-lock.json 文件通常弊大于利!关于找不到@foo/errors
,如果您运行 npm 引导程序,@foo/core
应该符号链接到@foo/errors
.一种可能性是你的lerna脚本正在使用npm,而你在哪里运行安装/链接与纱线。
你能把你的lerna移到一个同时包含'foo'和'bar'的目录吗? 这可能吗?
root/
foo/
packages/
core/
package.json
errors/
package.json
bar/
package.json
lerna.json
在您的 lerna 文件中,您可以将存储库添加到包中
{
"lerna": "2.9.0",
"packages": [
"foo/packages/*",
"bar/",
],
}
在稍微不同的条件下,您正在使用的 npm 模块之一不是 lerna 存储库的一部分,您可以使用 lerna 执行npm link
命令。
npx lerna exec -- npm link <npm_package_name>
这将npm link
所有lerna模块中的外部包。
这不应该与lerna link
混淆,后者将为您的lerna repo中的所有子模块做类似的事情,并且是该问题的当前解决方案。
使用可以像这样尝试:
foo/packages/core/package.json
{
...
dependencies: {
"@foo/errors": "file:../errors"
}
}
bar/package.json
{
...
dependencies: {
"@foo/core": "file:../foo/packages/core"
}
}