@Dale-Lin
2022-09-09T04:01:36.000000Z
字数 4163
阅读 602
web开发技术
npx create-turbo@latest
pn add turbo -D --ignore-workspace-root-check
# pnpm-workspace.yamlpackages:- "packages/*"- "apps/*"
# ....turbo
// turbo.json{"$schema": "https://turborepo.org/schema.json","pipeline": {"build": {"build": {// "^" 表示执行 turbo run build 时// 每个有 build 脚本的 pkg 处理拓扑依赖(upstream mono deps)"dependsOn": ["^build"],// 路径相对于 packages/**/package.json"outputs": [".next/**"]}},"test": {// 执行 turbo run test 会先执行依赖的 turbo run build"dependsOn": ["build"],"outputs": [],// 只有下列文件发生变更才需要重新执行"inputs": ["src/**/*.tsx","src/**/*.ts","test/**/*.tsx","test/**/*.ts"]},"lint": {// 随时可以执行outputs: []},"deploy": {"dependsOn": ["build","test","lint"],"outputs": []}}}
若某个包的 package.json 里没有 pipeline task 对应的 script,那个包会被忽略执行这个 task。
turbo 只能执行 pipeline 里指定了的任务。
//#<task> 用来配置根目录下的 package.json 也需要执行的任务
{"$schema": "https://turborepo.org/schema.json","pipeline": {"build": {"dependsOn": ["^build"]},// "turbo run test" 会触发工作区 package.json 的 test 脚本"test": {"dependsOn": ["^build"],"outputs": [],},// "turbo run test" 会触发根目录 package.json 的 test 脚本"//#test": {"dependsOn": [],"outputs": []},// "turbo run format" 会触发根目录 package.json 的 format 脚本// 由于 pipeline 没有 "format" 任务,不会触发工作区的任何脚本"//#format": {"dependsOn": [],"outputs": ["dist/**/*"],"inputs": ["version.txt"]},}}
使用 <package>#<task> 可以单独配置某个包的某个任务,或指定某个包的某个任务为依赖:
{"$schema": "https://turborepo.org/schema.json","pipeline": {// Standard configuration"build": {"dependsOn": ["^build"]},"test": {"dependsOn": ["^build"],"outputs": [],},"deploy": {"dependsOn": ["test", "build"],"outputs": []},// Explicit package-task to package-task dependency"frontend#deploy": {"dependsOn": ["ui#test", "backend#deploy", "backend#health-check"],"outputs": []},}}
package-tasks 不会继承缓存配置,需要重新声明 outputs
--filter= 参数使命令过滤不符合条件的 pkgs
turbo run build --filter=my-pkgturbo run build --filter=@foo/bar# 以 'admin-' 开头的包turbo run build --filter=admin-*
// 指定为根目录
turbo run format --filter=//
... 前缀指定具有某个依赖
# 所有依赖了 my-lib 的 package.json 会触发 test 脚本,包括 my-lib 自己turbo run test --filter=...my-lib# 同上,但不包括 my-lib 自己turbo run test --filter=...^my-lib
... 后缀指定某个包的依赖
# build my-app 及其依赖turbo run build --filter=my-app...# build my-app 的依赖,不包括 my-app 自己turbo run build --filter=my-app^...
glob 表达式;和 ... 或者包名组合使用的时候用 {} 包裹目录。
turbo run build --filter=./apps/*
# build 'libs' 下的所有包,以及依赖它们的包turbo run build --filter=...{./libs/*}
turbo run test --filter=@foo/*{./packages/*}
[] 指定 git commit 的 diff,turbo 会选择所有在 commit diff 里变更的包;同样可以结合 ... 使用
# Test everything that changed in the last committurbo run test --filter=[HEAD^1]# 依赖 'my-feature' 分支的改动的所有包turbo run build --filter=...[origin/my-feature]# 上一次 commit 后有变更的 @foo/bar 及其依赖turbo run build --filter=@foo/bar...[HEAD^1]# 在 @scope 域且在 'packages' 目录下# 且在上次 commit 后发生变更的包turbo run test --filter=@scope/*{./packages/*}[HEAD^1]# 'main' 分支和 'my-featur' 分支之间发生变更的包turbo run test --filter=[main...my-feature]
可以配合
--ignorecli 参数
turbo run build --ignore="apps/**/*"turbo run build --ignore="packges/**/*" --ignore="\!/packages/not-this-one/**/*"
正向规则(例如 foo/*)添加文件,负向规则(例如 !foo)减少文件;因此只使用负向规则 [!foo] 并不会匹配任何内容,应该使用 ['*', '!foo']
*:匹配任意个任意字符,除了 /?:匹配单个任意字符,除了 /**:匹配任意个任意字符,包括 /{}:支持由逗号分隔的多个“或”表达式!:负向规则开头turbo run 默认认为通过 scripts 输出到每个 pipeline 的 outputs 目录的内容是可缓存的;并会在包目录 .turbo/run-<command>.log 下生成可缓存的运行日志,通过对运行日志的缓存,可以告诉 turbo 使用缓存。
使用 pipeline.<task>.outputs globs 来说明需要缓存的产物目录。
{"$schema": "https://turborepo.org/schema.json","pipeline": {"build": {"outputs": ["dist/**", ".next/**"],"dependsOn": ["^build"]},"test": {"outputs": [], // 只会缓存 log"dependsOn": ["build"]}}}
outputs 的产物和对应任务的日志都会被缓存在 ./node_modules/.cache/turbo 目录下。
删除 outputs 指定目录下的真实产物不影响
./node_modules/.cache/turbo缓存。
使用 cli 参数 --no-cache 可以关闭该命令的缓存:
trubo run dev --parallel --no-cache
设置 pipeline.<task>.cache 为 false 可以关闭某个 script 的缓存:
{"$schema": "https://turborepo.org/schema.json","pipeline": {"dev": {"cache": false}}}
使用 pipeline.<task>.inputs 告知 turbo 是否缓存是否过期的判断文件:
{"$schema": "https://turborepo.org/schema.json","pipeline": {"test": {"outpus": [],"dependsOn": ["build"],"inputs": ["src/**/*.tsx","src/**/*.ts","test/**/*.ts"]}}}
特殊的是
turbo.json文件的变更会使所有缓存失效。
在开发环境发生变更后,缓存通常会失效。turbo 允许通过环境变量和 contenthash 的结合来控制缓存:
$ 前缀的环境变量可以添加到 pipeline.<task>.dependsOn 数组中,从而影响某个任务的缓存 hashglobalDependencies 中使用 $ 前缀的环境变量则会影响所有任务的缓存 hashTHASH 的环境变量,例如:STRIPE_PUBLIC_THASH_SECRET_KEY 会影响所有任务的缓存 hash对于一些构建框架(例如 Next/Nuxt/CRA/Vite/Vue)的一些 CI 环境变量,turbo 已经自动集成了