使用 yarn 工作区和 lerna 优先构建顺序
Posted
技术标签:
【中文标题】使用 yarn 工作区和 lerna 优先构建顺序【英文标题】:Prioritize build order with yarn workspaces and lerna 【发布时间】:2019-01-01 23:59:14 【问题描述】:我在使用 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
如何触发构建的顺序?
【问题讨论】:
【参考方案1】:到目前为止,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
下有许多模块,那可能会很快变得难看。
【讨论】:
以上是关于使用 yarn 工作区和 lerna 优先构建顺序的主要内容,如果未能解决你的问题,请参考以下文章
Lerna、yarn 和 Typescript:找不到模块或其对应的类型声明
javascript 使用lerna,monorepo和yarn工作空间创建一个babel变换器来修复babel-jest问题
如何在不发布的情况下在 lerna monorepo 中构建 docker 镜像
基于 Yarn WorkSpace + Lerna + OrangeCI 搭建 Typescript Monorepo 项目实践