【问题标题】:Yarn & Monorepo: Prevent using local packagesYarn & Monorepo:防止使用本地包
【发布时间】:2023-03-09 02:56:01
【问题描述】:

我有一个 yarn/lerna monorepo,其中包含多个相互依赖的包。如果我将packageA 添加为packageB 的依赖项并执行yarn install,我发现node_modules/packageA 实际上是packages/packageA 的符号链接,而不是该包的已发布版本。

如果packageBpackageA 之前构建,这会在CI 上产生问题- 构建失败,因为node_modules/packageA 只是指向裸源,没有构建产品(因为packageA 尚未构建)。

如何强制 yarn 始终下载 packageA 的已发布版本?


yarn --version: 1.22.10

旁注:如果我想使用packageA 的本地版本,我会使用yarn link 或本地路径而不是package.json 中的版本。为什么纱线默认为这种行为?

【问题讨论】:

    标签: yarnpkg yarn-workspaces


    【解决方案1】:

    一个选项是:“重点工作区”-see the guide here

    在我的例子中,我添加了一个文件 packages/packageB/.yarnrc,它指定始终为 yarn install 使用 --focus 参数:

    --install.focus true
    

    这将确保packageB 在其自己的node_modules 文件夹中拥有已发布的packageA 的副本。

    但是:这一次只适用于一个包。

    【讨论】:

      【解决方案2】:

      您可以按依赖顺序构建包。所以在你的情况下,在你的 CI 中它会是这样的(假设在包的 package.json 中有一个名为“build”的脚本条目):

      yarn workspace packageA run build
      yarn workspace packageB run build
      

      这样您可以控制构建的顺序,它们会成功完成,并且您不必强制使用已发布的包。

      【讨论】:

      • 实际上,lerna 已经按照依赖顺序自动构建包。这消除了像这样手动指定构建顺序的需要。
      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 2019-01-16
      • 2012-06-13
      • 2021-01-18
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多