Yarn & Monorepo:防止使用本地包
Yarn & Monorepo: Prevent using local packages
我有一个 yarn/lerna monorepo,其中包含多个相互依赖的包。如果我将 packageA
添加为 packageB
的依赖项并执行 yarn install
我看到 node_modules/packageA
实际上是 packages/packageA
的符号链接而不是该包的发布版本.
如果 packageB
在 packageA
之前构建,这会在 CI 上产生问题 - 构建失败,因为 node_modules/packageA
只是指向裸源,没有构建产品(因为 packageA
还没有建成)。
如何强制 yarn 始终下载 packageA
的已发布版本?
yarn --version
: 1.22.10
旁注:如果我想使用 packageA
的本地版本,我会使用 yarn link
或本地路径而不是 package.json
中的版本。为什么纱线会默认这种行为?
一个选项是:“重点工作区”- see the guide here。
在我的例子中,我添加了一个文件 packages/packageB/.yarnrc
,指定始终对 yarn install
使用 --focus
参数:
--install.focus true
这将确保 packageB
在其自己的 node_modules
文件夹中拥有已发布 packageA
的副本。
但是:这一次只适用于一个包裹。
您可以只按照依赖项的顺序构建包。所以在你的情况下,它在你的 CI 中是这样的(假设在包的 package.json 中有一个名为“build”的脚本条目):
yarn workspace packageA run build
yarn workspace packageB run build
这样你就可以控制构建的顺序,它们会成功完成,而且你不必强制使用已发布的包。
我有一个 yarn/lerna monorepo,其中包含多个相互依赖的包。如果我将 packageA
添加为 packageB
的依赖项并执行 yarn install
我看到 node_modules/packageA
实际上是 packages/packageA
的符号链接而不是该包的发布版本.
如果 packageB
在 packageA
之前构建,这会在 CI 上产生问题 - 构建失败,因为 node_modules/packageA
只是指向裸源,没有构建产品(因为 packageA
还没有建成)。
如何强制 yarn 始终下载 packageA
的已发布版本?
yarn --version
: 1.22.10
旁注:如果我想使用 packageA
的本地版本,我会使用 yarn link
或本地路径而不是 package.json
中的版本。为什么纱线会默认这种行为?
一个选项是:“重点工作区”- see the guide here。
在我的例子中,我添加了一个文件 packages/packageB/.yarnrc
,指定始终对 yarn install
使用 --focus
参数:
--install.focus true
这将确保 packageB
在其自己的 node_modules
文件夹中拥有已发布 packageA
的副本。
但是:这一次只适用于一个包裹。
您可以只按照依赖项的顺序构建包。所以在你的情况下,它在你的 CI 中是这样的(假设在包的 package.json 中有一个名为“build”的脚本条目):
yarn workspace packageA run build
yarn workspace packageB run build
这样你就可以控制构建的顺序,它们会成功完成,而且你不必强制使用已发布的包。