儲存庫
文件
核心概念
程式碼產生

程式碼產生

將單一儲存庫分割成個別工作區是整理程式碼、加速任務和改善在地端開發體驗的絕佳方式。透過 Turborepo 的程式碼產生功能,可以輕鬆產生套件、模組,甚至個別 UI 元件的新原始程式碼,並以結構化的方式與儲存庫的其他部分整合。

新增一個空的 Workspace

將一個新的空應用程式或套件新增到您的單一儲存庫。

turbo gen workspace

查看 選項 的所有可用 gen workspace

Extend your Turborepo by adding a new package or application

複製現有的 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

Extend your Turborepo by copying an existing package or application

自訂產生器

如果內建產生器不符合你的需求,你可以使用 Plop(在新分頁中開啟) 設定建立你自己的自訂產生器。Turborepo 會自動偵測儲存庫中的任何產生器設定,並讓它們可從命令列執行。

注意:儘管 Turborepo 產生器建立在 Plop 之上,它們不需要plop 安裝為儲存庫中的相依性。

儘管 Turborepo 了解所有 Plop 設定選項和功能,它提供了一些額外功能,以改善在設定為 Turborepo 的儲存庫中撰寫產生器的體驗。

  1. 產生器會自動偵測、載入和依工作區組織(無需在單一設定檔中手動 載入 它們)
  2. 產生器會自動從定義它們的工作區根目錄執行
  3. 產生器可以在儲存庫中的任何位置(或透過 --root 旗標)在儲存庫外呼叫
  4. Typescript 產生器支援零設定
  5. 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 產生器,用於我們自己的開發。

Turborepo 範例