程式碼產生
將單一儲存庫分割成個別工作區是整理程式碼、加速任務和改善在地端開發體驗的絕佳方式。透過 Turborepo 的程式碼產生功能,可以輕鬆產生套件、模組,甚至個別 UI 元件的新原始程式碼,並以結構化的方式與儲存庫的其他部分整合。
新增一個空的 Workspace
將一個新的空應用程式或套件新增到您的單一儲存庫。
turbo gen workspace
查看 選項 的所有可用 gen workspace
。
複製現有的 Workspace
你可以使用現有工作區作為新應用程式或套件的範本。這適用於現有單一儲存庫中的工作區,以及其他儲存庫中的遠端工作區(透過 GitHub URL 指定)。
範例
透過從儲存庫中現有的工作區複製,在單一儲存庫中建立新的工作區。
turbo gen workspace --copy
透過從遠端工作區複製,在單一儲存庫中建立新的工作區。
turbo gen workspace --copy https://github.com/vercel/turbo/tree/main/examples/with-tailwind/packages/tailwind-config
注意:從遠端來源新增時,Turborepo 無法驗證你的儲存庫是否具備所有必要的相依性,以及是否使用正確的套件管理員。在這種情況下,可能需要一些手動修改,才能讓新的工作區在你的儲存庫中按預期運作。
查看 選項 的所有可用 gen workspace --copy
。
自訂產生器
如果內建產生器不符合你的需求,你可以使用 Plop(在新分頁中開啟) 設定建立你自己的自訂產生器。Turborepo 會自動偵測儲存庫中的任何產生器設定,並讓它們可從命令列執行。
注意:儘管 Turborepo 產生器建立在 Plop 之上,它們不需要將 plop
安裝為儲存庫中的相依性。
儘管 Turborepo 了解所有 Plop 設定選項和功能,它提供了一些額外功能,以改善在設定為 Turborepo 的儲存庫中撰寫產生器的體驗。
- 產生器會自動偵測、載入和依工作區組織(無需在單一設定檔中手動
載入
它們) - 產生器會自動從定義它們的工作區根目錄執行
- 產生器可以在儲存庫中的任何位置(或透過
--root
旗標)在儲存庫外呼叫 - Typescript 產生器支援零設定
plop
不需要安裝為儲存庫的相依性
注意:目前自訂產生器不支援 ESM 相依性
開始使用
若要建置並執行自訂產生器,請使用 Turborepo 從單一儲存庫中的任何位置執行下列指令。
turbo gen
系統會提示你選擇現有的產生器,或是在你尚未擁有任何產生器時建立一個。你也可以在 turbo/generators/config.ts
(或 config.js
)手動建立設定檔,此檔案位於儲存庫根目錄或任何工作區中。
注意:如果你使用 Typescript,你需要安裝 @turbo/gen
(在新分頁中開啟) 套件作為 devDependency
,以存取必要的 TS 類型。
例如,以下說明一個具有三個產生器設定檔的單一儲存庫
- root
- apps/web
- packages/ui
├── package.json
├── turbo.json
├── README.md
├── apps
│ └── web
│ ├── package.json
│ └── turbo
│ └── generators
│ ├── config.ts
│ └── templates
├── packages
│ └── ui
│ ├── package.json
│ └── turbo
│ └── generators
│ ├── config.ts
│ └── templates
├── turbo
│ └── generators
│ ├── config.ts
│ └── templates
├── pnpm-lock.yaml
└── pnpm-workspace.yaml
在工作區中建立的產生器會自動從工作區根目錄執行,而非儲存庫根目錄或產生器設定檔的位置。
這讓你的產生器更易於撰寫。在 [workspace-root]
建立檔案只需要指定為 <file>
,而非 ../../<file>
。
進一步了解如何使用 Plop 建立自訂產生器(在新分頁開啟)。
撰寫產生器
產生器設定檔是一個傳回 Plop(在新分頁開啟) 設定物件的函式。設定物件用於定義產生器的提示和動作。
在最簡單的形式中,產生器設定檔看起來像
import type { PlopTypes } from "@turbo/gen";
export default function generator(plop: PlopTypes.NodePlopAPI): void {
// create a generator
plop.setGenerator("Generator name", {
description: "Generator description",
// gather information from the user
prompts: [
...
],
// perform actions based on the prompts
actions: [
...
],
});
}
提示
提示使用 Plop 提示(在新分頁開啟) 撰寫,用於從使用者收集資訊。
動作
動作可以使用 內建 Plop 動作(在新分頁開啟),或您自己定義的 自訂動作函式(在新分頁開啟)
import type { PlopTypes } from "@turbo/gen";
const customAction: PlopTypes.CustomActionFunction = async (answers) => {
// fetch data from a remote API
const results = await fetchRemoteData();
// add the response to the answers, making this data available to actions
answers.results = results;
// return a status string
return 'Finished data fetching!';
}
export default function generator(plop: PlopTypes.NodePlopAPI): void {
// create a generator
plop.setGenerator("Generator name", {
description: "Generator description",
prompts: [
...
],
actions: [
customAction
{/* actions now have access to `answers.results` */}
...
],
});
}
執行產生器
建立產生器設定檔後,您可以略過選取提示,並直接使用以下方式執行指定的產生器
turbo gen [generator-name]
也可以使用 --args
將參數直接傳遞給產生器提示
turbo gen [generator-name] --args answer1 answer2 ...
請參閱 Plop 文件中的 略過提示(在新分頁開啟),以取得更多資訊。
檢視 選項 以取得 gen
的所有可用選項。
範例
vercel/turbo(在新分頁中開啟) monorepo 包含幾個自訂 Turborepo 產生器,用於我們自己的開發。
- 建立新部落格文章(在新分頁中開啟) - 建立新的發行版 部落格文章,其中包含從 NPM 和 Github API 取得的即時統計資料。
- 建立新的程式碼轉換(在新分頁中開啟) - 為
@turbo/codemod
(在新分頁中開啟) 建立新的程式碼轉換,並包含所有樣板和測試。
Turborepo 範例