Turborepo logo

代码生成

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

添加一个空包

向你的单体仓库添加一个新的空应用或包。

终端
turbo gen workspace

查看 gen workspace 的所有可用选项

复制现有包

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

示例

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

终端
turbo gen workspace --copy

通过从远程包复制来在你的单体仓库中创建一个新的工作区。

终端
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 从单体仓库内的任何位置运行以下命令。

终端
turbo gen

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

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

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

package.json
package.json
package.json
package-lock.json
turbo.json

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

这使你的生成器更易于编写。在 [工作区根目录] 创建文件只需要指定为 <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 的所有可用选项

小时

总计算节省
开始使用
远程缓存 →

本页目录