生成代码

将您的单体仓库拆分为多个包是组织代码、加快任务速度和改善本地开发体验的好方法。借助 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作为 devDependency 以访问所需的 TS 类型。

例如,以下示例展示了一个单体仓库,其中包含三个生成器位置

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 的所有可用选项