Turborepo

代码生成

将你的 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作为 devDependency,以便访问所需的 TS 类型。

例如,以下示例说明了一个 monorepo,其中包含三个生成器位置

package.json
package.json
package.json
package-lock.json
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 的所有可用选项

小时

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

本页内容