[关闭]
@Dale-Lin 2022-09-09T12:01:36.000000Z 字数 4163 阅读 320

Turbo

web开发技术


Demo

  1. npx create-turbo@latest

Install

  1. pn add turbo -D --ignore-workspace-root-check

核心配置

workspaces

  1. # pnpm-workspace.yaml
  2. packages:
  3. - "packages/*"
  4. - "apps/*"

.gitignore

  1. # ...
  2. .turbo

pipeline

  1. // turbo.json
  2. {
  3. "$schema": "https://turborepo.org/schema.json",
  4. "pipeline": {
  5. "build": {
  6. "build": {
  7. // "^" 表示执行 turbo run build
  8. // 每个有 build 脚本的 pkg 处理拓扑依赖(upstream mono deps
  9. "dependsOn": ["^build"],
  10. // 路径相对于 packages/**/package.json
  11. "outputs": [".next/**"]
  12. }
  13. },
  14. "test": {
  15. // 执行 turbo run test 会先执行依赖的 turbo run build
  16. "dependsOn": ["build"],
  17. "outputs": [],
  18. // 只有下列文件发生变更才需要重新执行
  19. "inputs": [
  20. "src/**/*.tsx",
  21. "src/**/*.ts",
  22. "test/**/*.tsx",
  23. "test/**/*.ts"
  24. ]
  25. },
  26. "lint": {
  27. // 随时可以执行
  28. outputs: []
  29. },
  30. "deploy": {
  31. "dependsOn": [
  32. "build",
  33. "test",
  34. "lint"
  35. ],
  36. "outputs": []
  37. }
  38. }
  39. }

若某个包的 package.json 里没有 pipeline task 对应的 script,那个包会被忽略执行这个 task。

turbo 只能执行 pipeline 里指定了的任务。

//#<task> 用来配置根目录下的 package.json 也需要执行的任务

  1. {
  2. "$schema": "https://turborepo.org/schema.json",
  3. "pipeline": {
  4. "build": {
  5. "dependsOn": ["^build"]
  6. },
  7. // "turbo run test" 会触发工作区 package.json test 脚本
  8. "test": {
  9. "dependsOn": ["^build"],
  10. "outputs": [],
  11. },
  12. // "turbo run test" 会触发根目录 package.json test 脚本
  13. "//#test": {
  14. "dependsOn": [],
  15. "outputs": []
  16. },
  17. // "turbo run format" 会触发根目录 package.json format 脚本
  18. // 由于 pipeline 没有 "format" 任务,不会触发工作区的任何脚本
  19. "//#format": {
  20. "dependsOn": [],
  21. "outputs": ["dist/**/*"],
  22. "inputs": ["version.txt"]
  23. },
  24. }
  25. }

复杂依赖

使用 <package>#<task> 可以单独配置某个包的某个任务,或指定某个包的某个任务为依赖:

  1. {
  2. "$schema": "https://turborepo.org/schema.json",
  3. "pipeline": {
  4. // Standard configuration
  5. "build": {
  6. "dependsOn": ["^build"]
  7. },
  8. "test": {
  9. "dependsOn": ["^build"],
  10. "outputs": [],
  11. },
  12. "deploy": {
  13. "dependsOn": ["test", "build"],
  14. "outputs": []
  15. },
  16. // Explicit package-task to package-task dependency
  17. "frontend#deploy": {
  18. "dependsOn": ["ui#test", "backend#deploy", "backend#health-check"],
  19. "outputs": []
  20. },
  21. }
  22. }

package-tasks 不会继承缓存配置,需要重新声明 outputs

CLI

--filter

--filter= 参数使命令过滤不符合条件的 pkgs

  1. turbo run build --filter=my-pkg
  2. turbo run build --filter=@foo/bar
  3. # 以 'admin-' 开头的包
  4. turbo run build --filter=admin-*
  1. turbo run format --filter=//
  1. # 所有依赖了 my-lib 的 package.json 会触发 test 脚本,包括 my-lib 自己
  2. turbo run test --filter=...my-lib
  3. # 同上,但不包括 my-lib 自己
  4. turbo run test --filter=...^my-lib
  1. # build my-app 及其依赖
  2. turbo run build --filter=my-app...
  3. # build my-app 的依赖,不包括 my-app 自己
  4. turbo run build --filter=my-app^...
  1. turbo run build --filter=./apps/*
  1. # build 'libs' 下的所有包,以及依赖它们的包
  2. turbo run build --filter=...{./libs/*}
  1. turbo run test --filter=@foo/*{./packages/*}
  1. # Test everything that changed in the last commit
  2. turbo run test --filter=[HEAD^1]
  3. # 依赖 'my-feature' 分支的改动的所有包
  4. turbo run build --filter=...[origin/my-feature]
  5. # 上一次 commit 后有变更的 @foo/bar 及其依赖
  6. turbo run build --filter=@foo/bar...[HEAD^1]
  7. # 在 @scope 域且在 'packages' 目录下
  8. # 且在上次 commit 后发生变更的包
  9. turbo run test --filter=@scope/*{./packages/*}[HEAD^1]
  10. # 'main' 分支和 'my-featur' 分支之间发生变更的包
  11. turbo run test --filter=[main...my-feature]

可以配合 --ignore cli 参数

--ignore

  1. turbo run build --ignore="apps/**/*"
  2. turbo run build --ignore="packges/**/*" --ignore="\!/packages/not-this-one/**/*"

正向规则(例如 foo/*)添加文件,负向规则(例如 !foo)减少文件;因此只使用负向规则 [!foo] 并不会匹配任何内容,应该使用 ['*', '!foo']

glob 规则

缓存

turbo run 默认认为通过 scripts 输出到每个 pipeline 的 outputs 目录的内容是可缓存的;并会在包目录 .turbo/run-<command>.log 下生成可缓存的运行日志,通过对运行日志的缓存,可以告诉 turbo 使用缓存。

使用 pipeline.<task>.outputs globs 来说明需要缓存的产物目录。

  1. {
  2. "$schema": "https://turborepo.org/schema.json",
  3. "pipeline": {
  4. "build": {
  5. "outputs": ["dist/**", ".next/**"],
  6. "dependsOn": ["^build"]
  7. },
  8. "test": {
  9. "outputs": [], // 只会缓存 log
  10. "dependsOn": ["build"]
  11. }
  12. }
  13. }

outputs 的产物和对应任务的日志都会被缓存在 ./node_modules/.cache/turbo 目录下。

删除 outputs 指定目录下的真实产物不影响 ./node_modules/.cache/turbo 缓存。

关闭缓存

使用 cli 参数 --no-cache 可以关闭该命令的缓存:

  1. trubo run dev --parallel --no-cache

设置 pipeline.<task>.cachefalse 可以关闭某个 script 的缓存:

  1. {
  2. "$schema": "https://turborepo.org/schema.json",
  3. "pipeline": {
  4. "dev": {
  5. "cache": false
  6. }
  7. }
  8. }

判断缓存有效性

使用 pipeline.<task>.inputs 告知 turbo 是否缓存是否过期的判断文件:

  1. {
  2. "$schema": "https://turborepo.org/schema.json",
  3. "pipeline": {
  4. "test": {
  5. "outpus": [],
  6. "dependsOn": ["build"],
  7. "inputs": [
  8. "src/**/*.tsx",
  9. "src/**/*.ts",
  10. "test/**/*.ts"
  11. ]
  12. }
  13. }
  14. }

特殊的是 turbo.json 文件的变更会使所有缓存失效。

在开发环境发生变更后,缓存通常会失效。turbo 允许通过环境变量和 contenthash 的结合来控制缓存:

对于一些构建框架(例如 Next/Nuxt/CRA/Vite/Vue)的一些 CI 环境变量,turbo 已经自动集成了

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注