纱线+莱娜+角掌=破损出版?

时间:2020-09-25 00:18:00

标签: angularjs yarnpkg lerna

reHi!

这是交易,我们有一个monorepo。我们正在将Lerna&Yarn与一堆Angular库一起使用。

在每个包/库的package.json中,我们都有类似的内容:

"prepublishOnly": "yarn build <library name goes here>"

Yarn在工作空间中的工作方式为yarn install,它可以做到。因为我们使用工作区,所以它会为包创建符号链接。例如,如果我们在顶层@foo/bar中有一个名为node_modules的程序包,则我们会将node_modules/@foo/bar作为到libs/foo-bar的符号链接。

除了node_modules/@foo/bar中的内容尚未准备好发布之外,Yarn Workspace都很好。首先,我们需要使用Angular CLI的编译器来构建软件包。

我们使用prepublishOnly中已经提到的package.json脚本来完成此操作。

什么是有效的,当需要构建所有软件包时。流程进行到:

  1. yarn install-做符号链接/工作区魔术。
  2. lerna publish --contents dist-做monorepo魔术。 Lerna将看到所有软件包都进行了修改,并在所有软件包上运行prepublishOnly。这样,node_modules/@foo中的内容将是“合法” NPM软件包(用于构建库的Angular CLI的输出)

问题是当单个库进行修改时。

  1. yarn install-做符号链接/工作区魔术。 node_modules/@foo中的所有内容都将是指向libs/<package-name>的符号链接,此时它们是源文件。不是NPM软件包
  2. lerna publish --contents dist-启动...,然后转到“哦,只有Package A发生了更改。所以让我对它进行挑战。” Lerna将失败,因为node_modules中的其他软件包不是合法的NPM软件包。

我需要弄清楚如何做:

  1. 在进行发布时始终构建所有软件包或
  2. 在构建过程中以某种方式使用NPM注册表中的软件包

我觉得我在某个地方缺少一些简单的东西。

如果有示例可以帮助我解释,请询问。

1 个答案:

答案 0 :(得分:1)

在发布时始终构建所有软件包

在您的根package.json中(考虑到您已经将lerna作为开发依赖项)

[
  {
    "ID": "ID001",
    "Type": "Type1",
    "W1": 1,
    "W2": 2
  },
  {
    "ID": "ID001",
    "Type": "Type2",
    "W1": 2,
    "W2": 3
  },
  {
    "ID": "ID001",
    "Type": "Type3",
    "W1": 3,
    "W2": 4
  }
]

在您的library1包中

{
 "scripts": {
     "publish-ci": "lerna run build && lerna publish --content dist"
  }
}

现在您可以在根文件夹上运行 "scripts": { "build": "yarn build library1" } ,所有内容都将构建并发布。

您还可以使用yarn publish-ci标志来仅发布更改的软件包。

在构建过程中以某种方式使用NPM注册表中的软件包

在这里,您只需要lerna即可更改软件包,而不是发布软件包,这是一种骇人听闻的方式

在您的根包中。json

lerna publish --from-package

在custom.publish.js中

{
 "scripts": {
     "publish-ci": "node custom.publish.js"
  }
}