我在mono存储库中有一个大型typescript项目,使用yarn workspaces
和lerna
,具有以下架构:
repo
├── API
│ └── (GraphQL API)
├── Apps
│ └── (Front-end React Apps)
├── Libs
│ └── (Shared libraries)
└── Services
└── (Back-end Services)
我的package.json
看起来像:
{
...
"workspaces": [
"API/**/*",
"Apps/**/*",
"Libs/**/*",
"Services/**/*",
],
"scripts": {
"bootstrap": "lerna bootstrap",
"build": "lerna run build"
}
...
}
我的lerna.json
看起来像:
{
"lerna": "2.11.0",
"npmClient": "yarn",
"useWorkspaces": true,
"workspaces": [
"Libs/**/*",
"API/**/*",
"Apps/**/*",
"Services/**/*"
],
"version": "1.0.0"
}
现在我需要在Apps
和Services
之前构建所有共享的Libs
,因为它们都有依赖关系。但当我运行yarn build
并触发lerna run build
时,它似乎以随机(?(顺序触发了build
进程,所以它无法构建,因为库"还不存在"。
有没有办法设置lerna
如何触发构建的顺序?
到目前为止,lerna
中没有优先级。
虽然这是我目前在几个项目中所做的:
"scripts": {
...
"build": "lerna run build --ignore=libs-*",
"prebuild": "lerna run build --scope=libs-*"
...
}
注意:prebuild
将自动运行,因此您不需要显式调用它
这里需要注意的一点是,您需要在所有Libs
包名称前面加上像上面示例中的libs-module-name
之类的前缀,或者可能加上像@my-org-libs/module-name
之类的作用域,然后用@my-org-libs/*
来调用它们。
另一种解决方案是用prebuild
中的多个--scope=package-name --scope=package-name-2
参数显式调用每个Libs
包。但是,如果Libs
下有许多模块,这可能会很快变得很难看。