【发布时间】:2021-01-11 07:33:26
【问题描述】:
你好!
这是交易,我们有一个 monorepo。我们将 Lerna 和 Yarn 与一堆 Angular 库一起使用。
在包/库的每个 package.json 中,我们都有类似的内容:
"prepublishOnly": "yarn build <library name goes here>"
Yarn 在工作空间中的工作方式是 yarn install,做它的工作。因为我们使用工作空间,所以它会为包创建 symlinks。例如,如果我们有一个名为@foo/bar 的包,在顶级node_modules 中,我们将node_modules/@foo/bar 成为libs/foo-bar 的符号链接。
Yarn Workspaces 一切都很好,很漂亮,除了 node_modules/@foo/bar 中的内容还没有准备好发布。首先,我们需要使用 Angular CLI 的编译器来构建包。
我们通过package.json 中已经提到的prepublishOnly 脚本来实现这一点。
当需要构建所有包时起作用。流程如下:
-
yarn install- 符号链接/工作区有什么魔力。 -
lerna publish --contents dist- monorepo 有什么魔力。 Lerna 将看到所有包都已修改,并在所有包中运行prepublishOnly。这样,node_modules/@foo中的内容将是“合法”的 NPM 包(Angular CLI 构建库的输出)
问题是当单个库有修改时。
-
yarn install- 符号链接/工作区是否具有魔力。node_modules/@foo中的所有内容都将是指向libs/<package-name>的符号链接,此时它们是源文件。不是 NPM 包 -
lerna publish --contents dist- 开始......然后说“哦,只有包 A 发生了变化。所以让我来反对它。”由于node_modules中的其他包不是合法的 NPM 包,Lerna 将失败。
我需要弄清楚如何:
- 在发布时始终构建所有包或
- 在构建过程中以某种方式使用 NPM 注册表中的包
我觉得我在某处遗漏了一些简单的东西。
如果有我可以提供帮助解释的例子,请询问。
【问题讨论】: