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
脚本来完成此操作。
什么是有效的,当需要构建所有软件包时。流程进行到:
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
-启动...,然后转到“哦,只有Package A发生了更改。所以让我对它进行挑战。” Lerna将失败,因为node_modules
中的其他软件包不是合法的NPM软件包。我需要弄清楚如何做:
我觉得我在某个地方缺少一些简单的东西。
如果有示例可以帮助我解释,请询问。
答案 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
标志来仅发布更改的软件包。
在这里,您只需要lerna即可更改软件包,而不是发布软件包,这是一种骇人听闻的方式
在您的根包中。json
lerna publish --from-package
在custom.publish.js中
{
"scripts": {
"publish-ci": "node custom.publish.js"
}
}