允许本地项目依赖本地 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 包的主要内容,如果未能解决你的问题,请参考以下文章

lerna入门教程

项目添加外部jar依赖(本地仓库方式)

Maven——将本地jar包投入本地仓库并使项目依赖

git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务

关于IDEA使用Maven工具打包带有本地依赖包的项目 在部署时 仍然找不到本地依赖包中某个类,发生ClassNotFoundException的异常

Maven添加依赖本地jar包