生成代码

将你的 Monorepo 拆分为多个包是组织代码、加速任务和改善本地开发体验的好方法。借助 Turborepo 的代码生成功能,可以轻松地为包、模块甚至单个 UI 组件生成新的源代码,并以结构化的方式与仓库的其余部分集成。

添加一个空包

向你的 Monorepo 添加一个新的空应用或包。

终端
turbo gen workspace

查看 gen workspace 的所有可用 选项

复制现有包

你可以使用现有的工作区作为新应用或包的模板。这适用于现有 Monorepo 中的工作区,也适用于来自其他仓库的远程工作区(通过 GitHub URL 指定)。

示例

通过从仓库中的现有包复制,在你的 Monorepo 中创建一个新包。

终端
turbo gen workspace --copy

通过从远程包复制,在你的 Monorepo 中创建一个新的工作区。

终端
turbo gen workspace --copy https://github.com/vercel/turborepo/tree/main/examples/with-tailwind/packages/tailwind-config

注意:从远程源添加时,Turborepo 无法验证你的仓库是否拥有所有必需的依赖项,以及是否正在使用正确的包管理器。在这种情况下,可能需要进行一些手动修改才能使新的工作区在你的仓库中按预期工作。

查看 gen workspace --copy 的所有可用 选项

自定义生成器

如果内置生成器不符合你的需求,你可以使用 Plop 配置创建你自己的自定义生成器。Turborepo 将自动检测你的仓库中的任何生成器配置,并使其可从命令行运行。

虽然 Turborepo 生成器构建于 Plop 之上,但它们不需要在你的仓库中将 plop 作为依赖项安装。

虽然 Turborepo 理解所有 Plop 配置选项和功能,但它提供了一些额外的功能来改善在配置了 Turborepo 的仓库中编写生成器的体验。

  1. 生成器会被自动发现、加载并按工作区组织(无需在单个配置文件中手动 load 它们)
  2. 生成器会自动从定义它们的工作区的根目录运行
  3. 可以从仓库内的任何位置(或通过 --root 标志从外部)调用生成器
  4. 零配置支持 TypeScript 生成器
  5. 不需要将 plop 作为仓库的依赖项安装

已知问题

自定义生成器目前不支持 ESM 依赖项。

开始使用

要构建和运行自定义生成器,请使用 Turborepo 从你的 Monorepo 中的任何位置运行以下命令。

终端
turbo gen

系统将提示你选择现有生成器,或者在你还没有任何生成器时创建一个。你也可以在仓库根目录或任何工作区内的 turbo/generators/config.ts(或 config.js)手动创建你的配置。

如果你正在使用 TypeScript,你将需要安装 @turbo/gen作为 devDependencies 以访问所需的 TS 类型。

例如,以下示例说明了一个具有三个生成器位置的 Monorepo

package.json
package.json
package.json
package-lock.yaml
pnpm-workspace.yaml
turbo.json

在工作区内创建的生成器会自动从工作区根目录运行,而不是仓库根目录或生成器配置的位置。

这使你的生成器更易于编写。在 [workspace-root] 创建文件只需要指定为 <file>,而不是 ../../<file>

了解更多关于 使用 Plop 创建自定义生成器的信息。

编写生成器

生成器配置文件是一个返回 Plop 配置对象的函数。配置对象用于定义生成器的提示和操作。

最简单的形式,生成器配置文件看起来像

turbo/generators/config.ts
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 操作,或你自定义定义的 自定义操作函数

turbo/generators/config.ts
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 的所有可用 选项