turbo.json 的配置
单包内的任务调度
在 monorepo 内,一个子包的任务可能需要经过几个前置命令。
比如在 utils\package.json 内生成文档,需要先生成文件,移动文件,然后才能本地跑命令,做打包。
json
{
"scripts": {
"copy-readme": "cpx readme.md docs",
"typedoc": "typedoc",
"docs:dev-main": "vuepress-vite dev docs",
"docs:dev": "turbo docs:dev",
"build:docs-main": "vuepress-vite build docs",
"build:docs": "turbo do-build-docs"
}
}我们可以在子包内定义这样的 turbo.json 配置:
turbo.json 配置
在 utils/turbo.json 内:
json
{
"extends": ["//"],
"tasks": {
"copy-readme": {
"cache": false
},
"typedoc": {
"cache": false
},
"generate-md": {
"dependsOn": ["copy-readme", "typedoc"]
},
"docs:dev-main": {
"dependsOn": ["generate-md"]
},
"docs:dev": {
"dependsOn": ["docs:dev-main"]
},
"build:docs-main": {
"dependsOn": ["generate-md"]
},
"do-build-docs": {
"dependsOn": ["build:docs-main"]
}
}
}extends 继承根配置
因为是子包,所以要求继承根包配置的文件。语法如下:
json
{
"extends": ["//"]
}最底层的任务无需缓存
按照这样的业务设计,移动文件,生成文档,以及未来可能增加的 prettier 文件格式化,都不应该被缓存。
如果文件移动任务被 turbo 缓存了,那么下一次执行时就会跳过,就不会真正地移动最新的文件了。
json
{
"tasks": {
"copy-readme": {
"cache": false
},
"typedoc": {
"cache": false
}
}
}可以封装中间任务 generate-md
在当前业务内,移动文件,生成文件都是一个阶段的任务,都是并行任务,我们可以凭空封装一个不在 package.json 内的任务 generate-md,让其他的任务更好地声明。
json
{
"tasks": {
"generate-md": {
"dependsOn": ["copy-readme", "typedoc"]
}
}
}重命名以避免死循环
这里因为涉及到和根任务配置相关的东西,为了避免死循环,turbo 定义的任务名称为 do-build-docs,而不是重名的 build:docs。
json
{
"tasks": {
"do-build-docs": {
"dependsOn": ["build:docs-main"]
}
}
}tui 多任务分屏配置
构建效果如图所示:
核心配置是在 monorepo 的根包内,配置 ui 即可。
json
{
"ui": "tui"
}根包安装子包依赖,实现在根包以依赖关系触发批量构建
首先在 monorepo 的根包内,全面的以 pnpm 工作区协议,安装子包。确定其依赖关系。
json
{
"dependencies": {
"@ruan-cat-docs/docs-01-star": "workspace:^",
"@ruan-cat-docs/my-pull-requests": "workspace:^",
"@ruan-cat-docs/notes": "workspace:^",
"@ruan-cat-docs/rpgmv-dev-notes": "workspace:^"
}
}然后在根包的 turbo.json 配置内,就可以配置基于拓扑依赖关系的同名命令一键批量执行的命令了。
json
{
"tasks": {
"build:docs": {
"cache": true,
"outputs": ["**/.vuepress/dist/**", "**/.vitepress/dist/**"],
"dependsOn": ["^build:docs"]
}
}
}如果没有实现根包对子包的拓扑依赖,那么 turbo.json 配置就要写成这样。只能手动的获取需要依赖的子命令,写死路径,带来隐性的维护成本:
json
{
"tasks": {
"//#do-build": {
"cache": true,
"outputs": ["**/.vuepress/dist/**", "**/.vitepress/dist/**"],
"dependsOn": [
"@ruan-cat-docs/notes#build:docs",
"@ruan-cat-docs/docs-01-star#build:docs",
"@ruan-cat-docs/rpgmv-dev-notes#build:docs"
]
}
}
}