目錄
配置開發任務
在 `dev` 之前運行設置任務
運行特定應用程序
使用終端 UI
與任務交互
監聽模式
watch
將 turbo watch 與持久任務一起使用
依賴感知的持久任務
沒有依賴感知的持久任務
緩存
任務輸出
局限性
在 Monorepo 中開發應用程序可以解鎖強大的工作流程,使你能夠進行原子提交到源代碼控制,并輕松訪問代碼。
大多數開發任務都是長時間運行的任務,它們會監視代碼的更改。Turborepo 通過強大的終端 UI 和其他功能(例如)增強了這種體驗
配置開發任務
在 `turbo.json` 中定義一個開發任務會告訴 Turborepo 你將要運行一個長時間運行的任務。這對于運行開發服務器、運行測試或構建應用程序等操作非常有用。
要注冊一個 `dev` 任務,請將其添加到你的 `turbo.json` 中,并帶有兩個屬性
{"tasks": {"dev": {"cache": false,"persistent": true}}
}
- "cache": false: 告訴 Turborepo 不要嘗試緩存任務的結果。由于這是一個開發任務,你可能會頻繁更改代碼,因此緩存結果沒有用處。
- "persistent": true: 告訴 Turborepo 讓任務持續運行直到你停止它。這個鍵作為終端 UI 的信號,將該任務視為長時間運行且可交互的任務。此外,它可以防止你意外地依賴于一個不會退出的任務。
現在你可以運行你的 `dev` 任務以并行啟動你的開發腳本
turbo dev
在 `dev` 之前運行設置任務
你可能還想運行一些腳本來設置你的開發環境或預構建軟件包。你可以使用 `dependsOn` 確保這些任務在 `dev` 任務之前運行
{"tasks": {"dev": {"cache": false,"persistent": true,"dependsOn": ["//#dev:setup"]},"//#dev:setup": {"outputs": [".codegen/**"]}}
}
在這個例子中,我們使用了 根任務,但你也可以將相同的想法用于 軟件包中的任意任務。
運行特定應用程序
`--filter` 標志允許你選擇你的 軟件包圖 的子集,以便你可以為特定的應用程序及其依賴項運行你的 `dev` 任務
turbo dev --filter=web
使用終端 UI
Turborepo 的終端 UI 啟用了一些功能,這些功能圍繞你的任務創建了高度交互的體驗。
自定義你的視圖
你可以使用快捷鍵快速調整 UI 以滿足你的需求。
與任務交互
你的一些工具可能允許你向其中鍵入輸入。例如 Drizzle ORM 的交互式遷移或 Jest 的測試套件的過濾和重新運行。
你可以與 標記為交互式 的任務進行交互,以便向它們提供輸入。
persistent
將任務標記為 persistent 以防止其他任務依賴于長時間運行的進程。 默認情況下,持久任務是 交互式 的。
{"tasks": {"dev": {"persistent": true}}
}
由于長時間運行的進程不會退出,因此依賴于它的任務永遠不會運行。 一旦你將任務標記為持久,如果其他任務依賴于它,turbo
?將拋出錯誤。
監聽模式
許多工具都有內置的監聽器,例如 `tsc --watch`,它們會對源代碼中的更改做出響應。但是,有些工具沒有。
`turbo watch` 為任何工具添加了一個依賴項感知的監聽器。源代碼的更改將遵循你在 `turbo.json` 中描述的 任務圖,就像你的所有其他任務一樣。
例如,使用像 `create-turbo` 這樣的包結構,以及以下任務和腳本
{"tasks": {"dev": {"persistent": true,"cache": false},"lint": {"dependsOn": ["^lint"]}}
}
}
當你運行 `turbo watch dev lint` 時,你會看到每當你更改源代碼時,`lint` 腳本都會重新運行,盡管 ESLint 沒有內置監聽器。`turbo watch` 也知道內部依賴關系,因此 `@repo/ui` 中的代碼更改將重新運行 `@repo/ui` 和 `web` 中的任務。
`web` 中的 Next.js 開發服務器和 `@repo/ui` 中 TypeScript 編譯器的內置監聽器將繼續像往常一樣工作,因為它們被標記為 `persistent`。
watch
基于代碼更改,重新運行倉庫中的任務。
turbo watch [tasks]
turbo watch 具有依賴感知能力,意味著任務將按照 在 turbo.json 中配置的順序 重新運行。
如果沒有提供任務,turbo 將顯示倉庫中軟件包可用的任務。、
turbo watch
將 turbo watch 與持久任務一起使用
持久任務標記為 "persistent": true,意味著它們不會退出。因此,它們不能在你的任務圖中被依賴。
這意味著當使用 turbo watch 時,持久任務將被忽略,其工作方式與 turbo run 相同,允許同時運行持久任務和非持久任務。
依賴感知的持久任務
當你的腳本具有內置的監視器(如 next dev),能夠檢測依賴項中的更改時,你不需要使用 turbo watch。 相反,使用腳本的內置監視器并將任務標記為長時間運行,使用 "persistent": true。
沒有依賴感知的持久任務
某些工具對 monorepo 不友好,并且不熱重載依賴項中的模塊。 在這些情況下,你應該將任務標記為 interruptible: true,以便在檢測到相關更改時,turbo watch 重新啟動任務。
turbo watch
?監視你的包的更改并自動重新啟動受影響的任務。 但是,如果任務是持久的,則默認情況下不會重新啟動。 要啟用重新啟動持久任務,請將?interruptible
?設置為?true
。
緩存
使用 Watch Mode 緩存任務目前是實驗性的,在 --experimental-write-cache 標志下。
turbo watch your-tasks --experimental-write-cache
任務輸出
如果你的任務寫入檢入到源代碼控制的文件,則 Watch Mode 有可能進入無限循環。 這是因為 Watch Mode 監視你的文件更改,并將重新運行已更改軟件包中的任務。 如果任務創建了更改,那么這將再次觸發該任務。
Watch Mode 具有一些邏輯來防止這種情況發生,使用文件哈希,但這并非萬無一失。 為了避免這個問題,我們建議從 git 中刪除任何任務輸出。?
局限性
清理任務
在某些情況下,你可能希望在 `dev` 任務停止時運行一個腳本。Turborepo 無法在退出時運行這些清理腳本,因為當你的 `dev` 任務退出時,`turbo` 也會退出。
相反,創建一個 `turbo dev:teardown` 腳本,在你退出主要的 `turbo dev` 任務后單獨運行它。