允许本地项目依赖本地 lerna 包
Posted
技术标签:
【中文标题】允许本地项目依赖本地 lerna 包【英文标题】:Allow local project to depend on local lerna packages 【发布时间】:2018-08-08 19:55:42 【问题描述】:我有一个正在开发的项目的 lerna 存储库。它有几个相互依赖的包。为了使开发更容易,没有发布任何包,并且它们依赖于彼此的最新版本。
目录树
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 .DELETE errors。删除我的 package-lock.json 并重新安装让我失去了很多年。 使用纱线,我无法在bar
中使用yarn install
。 Yarn 遵循file:
对@foo/core
的依赖,发现它依赖于@foo/errors
并且不知道lerna 的符号链接。这导致它失败,告诉我它找不到@foo/errors
。
这使得为这个项目编写实际代码成为次要的依赖管理。
我怎样才能使这个(我觉得很简单?)项目结构有效?此时打开 lerna/yarn/npm/pnpm/shell scripts/MS DOS。
【问题讨论】:
【参考方案1】:在稍微不同的情况下,您正在使用的 npm 模块之一不属于您的 lerna 存储库,您可以使用 lerna 执行 npm link
命令。
npx lerna exec -- npm link <npm_package_name>
这将npm link
你所有lerna模块中的外部包。
这不应与 lerna link
混淆,后者将对您的 lerna 存储库中的所有子模块执行类似的操作,并且是该问题的当前解决方案。
【讨论】:
【参考方案2】:使用可以这样尝试:
foo/packages/core/package.json
...
dependencies:
"@foo/errors": "file:../errors"
bar/package.json
...
dependencies:
"@foo/core": "file:../foo/packages/core"
【讨论】:
这与我在问题中指定的目录结构不匹配,也不适用于 lerna。 :( 您好:您可以尝试更改 core/package.json 的属性 "name":"@foo/core" 和 errors/package.json 的 "name": "@foo/errors" ,祝你好运! "name": "bar", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": "@foo/core": "file:../foo/packages/core", "@foo/errors": "file:../foo/packages/errors" , "name": "@foo /core", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": "@foo/errors": "file:../错误" , "name": "@foo/errors", "version": "1.0.0", "main": "index.js", "license": "MIT" 但是当你发布你的项目时会发生什么?使用本地文件夹作为依赖项不起作用?在正常的工作流程中,您可能希望临时覆盖包路径,就像npm link
通常会做的那样。因此,依赖项“foobar@0.0.1”像往常一样从 NPM 中获取,或者使用 npm 链接从本地开发版本中获取。我找不到与 Lerna 类似的模式。【参考方案3】:
您应该可以使用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 bootstrap,@foo/core
应该符号链接到@foo/errors
。一种可能是您的 lerna 脚本在运行 install/link with yarn 时正在使用 npm。
【讨论】:
--hoist
帮了大忙!【参考方案4】:
你能把你的 lerna 移到一个同时包含 'foo' 和 'bar' 的目录吗? 这可能吗?
root/
foo/
packages/
core/
package.json
errors/
package.json
bar/
package.json
lerna.json
在你的 lerna 文件中,你可以将你的 repos 添加到包中
"lerna": "2.9.0",
"packages": [
"foo/packages/*",
"bar/",
],
【讨论】:
虽然我过去使用过这个选项,但它并不理想,因为我想单独管理 git repos 并最终将/foo
发布到 npm。
奖励赏金,因为这是我见过的最接近可行解决方案的解决方案,但没有将其标记为答案,希望有更好的解决方案。 :)
@JackGuy 你找到办法了吗?我和你完全一样。
@MichaelWolthers 我坚持使用 Yarn,主要依靠 yarn link
将包放入非 lerna 项目中。有点痛苦,但我找到的唯一可靠的解决方案。将初始版本发布到 npm 后,事情会变得容易得多。
yarn lerna exec yarn link
- 如果您需要一次性创建链接,非常方便以上是关于允许本地项目依赖本地 lerna 包的主要内容,如果未能解决你的问题,请参考以下文章
git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务
关于IDEA使用Maven工具打包带有本地依赖包的项目 在部署时 仍然找不到本地依赖包中某个类,发生ClassNotFoundException的异常