這裡講解了 turbo run
指令的用法,該指令用於在 Turborepo 中執行 turbo.json
中指定的任務。它支援多個選項來控制任務的執行行為,並且可以傳遞參數給具體的任務。以下是主要的重點:
turbo run [tasks] [options] [-- [args passed to tasks]]
turbo.json
中指定。--affected
:只執行當前分支上受影響的 package。--cache-dir <path>
:指定文件系統的快取目錄。--concurrency <number | percentage>
:設定任務執行的最大並發數量,預設為 10。--continue
:遇到錯誤後是否繼續執行任務。--cwd <path>
:指定工作目錄。--dry / --dry-run
:顯示會執行哪些任務,而不實際執行它們。--filter <string>
:篩選要執行的目標,可以根據 package、目錄或 Git 提交篩選。--force
:忽略快取,重新執行所有任務。--parallel
:忽略任務依賴圖,並行執行任務。--profile
:生成 Chrome Tracing 格式的運行追蹤,用於性能分析。--summarize
:生成 JSON 檔案,包含運行的元數據,如受影響的 package 和執行的任務。turbo run build --filter={.apps/*}[HEAD^1]
:執行所有 apps
子目錄中,自上次提交後有變更的 package。turbo run build --filter=docs --filter=web
:執行 docs
和 web
package 的 build 任務。turbo run build --concurrency=50%
:以 50% 的 CPU 使用率並發執行任務。turbo run test --concurrency=5
:限制同時執行 5 個測試任務。--dry
可以查看即將執行的任務而不真正執行,這對於除錯和優化很有幫助。--filter
可以針對具體 package 或目錄進行精細篩選,特別是當需要針對特定變更進行編譯或測試時。--profile
是追蹤性能的好工具,特別是對於大型 monorepo。要在當前分支上執行受影響的 build、lint 和測試任務,可以使用以下指令:
turbo run build lint test --affected
當要排除某個特定的 package 並進行構建時,使用以下範例:
turbo run build --filter=./apps/* --filter=!./apps/admin
--parallel
可以進一步控制這種行為。--force
允許忽略現有快取,強制重新執行任務。--global-deps <file glob>
:指定全局文件系統依賴的文件模式,這對 .env
文件或影響多個 package 的文件很有用。範例:
turbo run build --global-deps=".env" --global-deps=".eslintrc"
--graph <file type>
:生成當前任務圖的圖像文件(支援 svg
、png
、jpg
等格式)。如果沒有提供文件名,將會輸出 .dot
格式的圖形。範例:
turbo run build test lint --graph=my-graph.svg
--log-order <option>
:設置日誌輸出的順序。選項包括:
stream
:當日誌可用時立即顯示。grouped
:按任務分組顯示日誌。auto
:由 Turbo 根據環境自動決定。範例:
turbo run build --log-order=stream
--log-prefix <option>
:控制日誌行前綴格式。選項包括:
prefix
:強制為日誌加上 <package>:<task>
前綴。none
:不使用任何前綴。auto
:Turbo 自動決定是否加上前綴。範例:
turbo run dev --log-prefix=none
--no-cache
:不快取任務結果,強制所有任務都重新執行。範例:
turbo run dev --no-cache
--remote-only
:只使用遠端快取,忽略本地快取。範例:
turbo run build --remote-only
--token
和 --team
:這些選項主要用於配置遠端快取時提供身份驗證憑證,例如 Vercel 的遠端快取。使用 --token
指定 bearer token,--team
指定遠端快取的團隊。範例:
turbo run build --team=my-team --token=xxxxxxxxxxxxxxxxx
--ui <option>
:指定輸出 UI 顯示格式。可接受的選項包括 stream
和 tui
。--verbosity
:控制日誌的詳細級別。可選擇 -v
(info)、-vv
(debug)、-vvv
(trace)。範例:
turbo run build --verbosity=2
--continue
:默認情況下,當一個任務出現錯誤時,Turbo 會停止執行後續任務。使用 --continue
可以讓 Turbo 遇到錯誤時繼續執行其他任務,但最終 Turbo 會返回執行中出現的最高錯誤碼。範例:
turbo run build --continue
在開發過程中,只需要執行發生變更的 package 的任務,可以使用 --affected
:
turbo run build lint test --affected
若要針對某個特定分支的變更進行比對並執行任務,透過設置 TURBO_SCM_BASE
與 TURBO_SCM_HEAD
來覆寫 Git 的比對基準:
TURBO_SCM_BASE=development turbo run build --affected
TURBO_SCM_HEAD=my-feature-branch turbo run build --affected
turbo run
命令來確保一致性和性能最佳化。turbo
簡化命令,例如 turbo build lint check-types
和 turbo run build lint check-types
是相同的命令。這裡介紹了 turbo watch
指令的用法,該指令會基於代碼變更自動重新執行任務。turbo watch
具有依賴感知能力,會按照 turbo.json
中配置的順序重新執行任務。這裡介紹了 persistent
(長時間執行)任務的相關概念和使用限制。
turbo watch [tasks]
tasks
:要監聽並重新執行的任務。turbo watch
是依賴感知的,因此會按照 turbo.json
中的依賴順序執行。"persistent": true
的任務不會退出,這意味著它們無法作為其他任務的依賴項。turbo watch
不會重新執行這些持續運行的任務。next dev
)具備依賴監聽功能,則不需要使用 turbo watch
,只需將任務標記為 "persistent": true
即可。turbo watch
在偵測到依賴變更時重新啟動任務。turbo watch
執行任務時,所有的快取操作都會被禁用。Watch Mode
進入無限循環,因為文件變更會觸發任務重新執行。建議將這些輸出文件排除在 Git 之外,以避免此問題。要監聽並重新執行 build
和 test
任務:
turbo watch build test
當你有持續執行的任務(例如 next dev
),應將其設為 persistent
並使用內建的依賴監聽,而不是依賴 turbo watch
:
"tasks": {
"dev": {
"persistent": true
}
}
next dev
),那麼你不需要依賴 turbo watch
來重新執行任務,因為腳本會自動監聽依賴的變更並進行必要的操作。在這種情況下,應該將任務設為 "persistent": true
,讓任務長期運行。範例:
"tasks": {
"dev": {
"persistent": true
}
}
turbo watch
。但這類工具無法檢測依賴項的變更,因此應該將任務標記為非持續性的,讓 turbo watch
在偵測到依賴變更時自動重啟任務。在 Watch 模式中,當任務產生會導致文件變更時,可能會觸發這些變更,從而導致任務再次執行,這可能會導致無限循環。
為了解決這個問題:
範例:
.gitignore
/output-folder/*
turbo watch
使用文件哈希來避免無限循環的發生,但這並不是萬無一失的,因此推薦將任務輸出從版本控制中移除以減少風險。當使用 turbo watch
時,所有的快取操作會被禁用,因為持續運行的任務需要立即響應文件變更而不依賴快取結果。因此,在監控模式下不會生成或使用任何快取。
build
任務和一個持續運行的 dev
任務,想要監聽代碼變更並重新執行 build
,而 dev
任務保持長期運行。可以這樣配置:"tasks": {
"build": {
"dependsOn": ["^build"]
},
"dev": {
"persistent": true
}
}
並使用以下指令啟動監控:
turbo watch build
這樣 build
會在文件變更時重新執行,而 dev
任務則持續運行,不受影響。
這裡介紹了 turbo prune
指令,該指令用於為指定的目標 package 生成一個部分 monorepo,並將結果輸出到一個名為 out
的目錄中。這對於精簡項目依賴和減少包大小非常有用,特別是當你只需要針對某個子應用或 package 進行構建時。
turbo prune [package]
turbo prune
會生成以下內容:
假設你的項目結構如下:
package.json
pnpm-lock.yaml
apps/
admin/
frontend/
packages/
scripts/
shared/
ui/
utils/
執行以下指令:
turbo prune frontend
會生成一個 out
目錄,包含精簡後的工作區,僅針對 frontend
應用進行構建。
生成後的結構如下:
package.json
pnpm-lock.yaml (partial)
apps/
frontend/
packages/
shared/
ui/
false
。此選項會調整輸出目錄,以便更容易配合 Docker 的最佳實踐和層快取機制。輸出結果將分為兩個文件夾:
json
:包含修剪過的 package.json
文件。full
:包含完整的內部 package 源代碼。範例:
turbo prune frontend --docker
生成後的結構如下:
pnpm-lock.yaml (partial)
full/
apps/
packages/
json/
package.json (from repo root)
apps/
frontend/package.json
packages/
shared/package.json
ui/package.json
./out
。此選項允許你自定義輸出目錄的位置。範例:
turbo prune frontend --out-dir=./custom-output
生成的結果將位於 ./custom-output
目錄中。
這篇文章介紹了 turbo ls
指令,它用於列出 monorepo 中的 package。該指令可以列出整個倉庫中的所有 package,或只列出指定的 package,並顯示相關的詳細資訊。
turbo ls [package(s)] [flags]
turbo ls
會列出整個倉庫中的所有 package,並包含以下資訊:
範例:
turbo ls
範例:
turbo ls web @repo/ui
main
和 HEAD
之間的變更,可以使用環境變數來更改比較基準。範例:
TURBO_SCM_BASE=development turbo ls --affected
json
和 pretty
(預設)。json
格式特別適合於需要進一步處理輸出數據的場景。範例:
turbo ls --output=json