【问题标题】:Allow local project to depend on local lerna packages允许本地项目依赖本地 lerna 包
【发布时间】: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。

【问题讨论】:

    标签: npm yarnpkg lerna


    【解决方案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 - 如果您需要一次性创建链接,非常方便
      猜你喜欢
      • 2020-03-14
      • 2018-07-19
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2022-01-17
      相关资源
      最近更新 更多