@factorialco/gat

中文文档
3.13.0发布于 2026/10/16MITTypeScriptES Module构建来源已验证近 30 天下载 1.9万

使用 TypeScript 写入您的 GitHub 动作工作流程

中文使用文档
文档目录9 节
  1. 安装
  2. 使用量
  3. 写入模板
  4. 编译您的模板
  5. 正在编译许多模板
  6. 固定动作
  7. 创建自己的工作流程类
  8. 捐款
  9. 许可证

枪 Build npm version

这个 gat 项目是用于 使用 TypeScript 写入您的 GitHub 动作工作流程。 。 。 .

维护 YAML 文件很困难, 如果你的项目足够大的话, 你会发现自己在工作流程之间复制了很多代码 。 与 gat 您可以仅仅使用 TypeScript 对象创建可重复使用的工作和步骤,并在工作流程模板中导入它们.

为什么 gat? 吗? 名字是"GitHub Actions Template Generator"的缩写,没有最后一部分,因为 gat 加泰罗尼亚语中"猫"的意思.

安装

使用以下命令安装主软件包及其依赖性:

npm i -D @factorialco/gat typescript tsx commander @swc/core

使用量

写入模板

这个 gat CLI假设你有 index.ts 内部文件 .github/templates。让我们创建第一个模板:

// .github/templates/index.ts
import { Workflow } from "@factorialco/gat";

await new Workflow("My first workflow")
  .on("push")
  .addJob("test", {
    steps: [
      {
        uses: "actions/checkout@v3",
      },
      {
        uses: "actions/setup-node@v3",
      },
      {
        run: "npm test",
      },
    ],
  })
  .compile({ filePath: "my-first-workflow.yml" });

请注意,你需要呼叫 compile() 方法,将选项对象与 filePath 用于创建 GitHub 动作工作流程.

编译您的模板

您可以在根文件夹中构建运行此命令的模板 :

npx gat build

遵循前一个例子, 您现在应该看到一个文件 .github/workflows/my-first-workflow.yml 像这样:

# Workflow automatically generated by gat
# DO NOT CHANGE THIS FILE MANUALLY

name: My first workflow
on:
  push: null
jobs:
  test:
    runs-on: ubuntu-22.04
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
      - run: npm test

注意到该工作包括一些假设,如: runs-on 财务报告和审定财务报表 timeout-minutes 字段。 你可以在增加新工作时改变这些.

正在编译许多模板

compileTemplates 在一个调用中将输出文件名映射到工作流程 :

// .github/templates/index.ts
import { compileTemplates } from "@factorialco/gat";

import Build from "./build";
import Deploy from "./deploy";

compileTemplates({
  templates: {
    "build.yml": Build,
    "deploy.yml": Deploy,
  },
});

它接受这些选项:

选项默认说明
templates文件名地图 .github/workflows 改为 Workflow 实例.
lockFilePath无路径 a gat-lock.json 文档。 没有它, Gat 写回信没有改变.
writeLockFilefalse解析每个动作标记到一个承诺的 SHA 并重写锁文件 .
failOnUnlockedActionsfalse当一个步骤使用锁文件中没有条目的动作时停止 .

writeLockFile 财务报告和审定财务报表 failOnUnlockedActions 需要一个 lockFilePath。 。 。 .

固定动作

标签, 如 actions/checkout@v4 可以转移到不同的承诺。 为了保证一个工作流程总是运行你审查过的代码,将每个动作都钉入一个承诺. 你可以用两种方式做到这一点。 使用其中一个,而不是两个.

选项 A: gat 锁定文件

gat 写入工作流程时,将每个动作标记替换为承诺 SHA .

  1. 添加 lockFilePath 财务报告和审定财务报表 writeLockFile 改为 compileTemplates,并读 writeLockFile 从环境变量:

    compileTemplates({
      templates,
      lockFilePath: ".github/templates/gat-lock.json",
      writeLockFile: process.env.GAT_WRITE_LOCK_FILE === "true",
      failOnUnlockedActions: true,
    });
    
  2. 运行建设一次 GAT_WRITE_LOCK_FILE=true (单位:千美元) GITHUB_TOKENGat 使用 GitHub API 解决每个标签并写入 gat-lock.json数字 :

    {
      "actions/[email protected]": "actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683"
    }
    
  3. 提交锁定文件 。 以后再写再读 uses: actions/checkout@11bd719... 输入工作流程.

与 failOnUnlockedActions: true,当一个步骤使用一个没有条目的动作时,构建停止。 没有它,Gat会写出标记,那步没有被钉住. SHA refs,当地 ./ 行动 docker:// 未检查图像 .

锁文件有这些限制 :

  • 写会解决模板使用的每一个动作并重写整个文件. 它可以将其它动作移动到新的承诺并删除您手工添加的条目. 全面审查 gat-lock.json。 。 。 .
  • 只有台阶被钉住。 行动要求的行动(过渡性依赖性)和可重复使用的工作流程没有固定.

选项B: GitHub 工作流程锁定文件

GitHub 可以用 工作流程依赖锁定文件编辑 gh actions-lock 扩展写 .github/workflows/actions.lock,则GitHub Actions运行锁定的输入。 它还标出过渡性依赖性,并检查动作存储器没有改变所有者.

  1. 未设置 lockFilePath. gat 然后从模板中写入标签.

  2. 安装扩展名 : gh extension install github/gh-actions-lock。 。 。 .

  3. 每次构建后, 从寄存器根更新锁定文件 :

    npx gat build
    gh actions-lock --no-narrow
    

    总是使用 --no-narrow没有它,工具会重写 uses: 例如工作流程中的行 @v4 改为 @v4.2.2。然后,工作流程将不再匹配模板,下一个构建将取消更改.

  4. 提交 actions.lock 与工作流程。 不要用手编辑它.

  5. 在CI中,检查每个拉出请求中更改工作流程的锁文件. 绑定扩展版本 :

    - run: gh extension install github/gh-actions-lock --pin v0.2.0
      env:
        GH_TOKEN: ${{ github.token }}
    - run: gh actions-lock --verify
      env:
        GH_TOKEN: ${{ github.token }}
    

    --verify 当一个工作流程或一个动作没有条目时失败,当一个锁定的承诺不再有效时失败.

GitHub锁文件在公开预览中,其格式可以改变. 如果锁文件无效,GitHub会忽略并运行标记,所以CI检查很重要.

不合并选项

两种选项都包含工作流程包含SHA. gh actions-lock 警告每个SHA参考。 无 --no-narrow,它也会将SHA重写为标记. 为寄存器选择一个选项 .

创建自己的工作流程类

您可以创建返回预配置的工厂功能 Workflow 有共享设置的示例。 这样可以避免模板的重复:

// .github/templates/helpers.ts
import { Workflow } from "@factorialco/gat";

export function createWorkflow(name: string) {
  return new Workflow(name)
    .setEnv("NODE_ENV", "production")
    .on("push", { branches: ["main"] });
}

然后用在您的模板中 :

// .github/templates/index.ts
import { createWorkflow } from "./helpers";

await createWorkflow("Test")
  .addJob("test", {
    steps: [{ run: "npm test" }],
  })
  .compile({ filePath: "test.yml" });

await createWorkflow("Lint")
  .addJob("lint", {
    steps: [{ run: "npm run lint" }],
  })
  .compile({ filePath: "lint.yml" });

这样,您的所有工作流程都共享相同的环境变量,触发,以及您在工厂函数中配置的任何其他默认值.

捐款

  1. 将寄存器分叉并克隆到本地
  2. 安装依赖性 : npm install
  3. 运行测试 : npm test
  4. 做修改,确保考试合格
  5. 提交拉动请求

许可证

麻省理工学院

版本与发布记录

@factorialco/gat 共发布 60 个版本,首次发布于 2022/08/26;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.13.0latest2026/10/1629 天前
3.12.02026/10/1530 天前
3.11.02026/07/313 个月前
3.10.12026/07/203 个月前
3.8.02026/04/017 个月前
3.5.02025/06/191.4 年前

关于 @factorialco/gat 的常见问题

@factorialco/gat 是什么?

使用 TypeScript 写入您的 GitHub 动作工作流程

如何安装 @factorialco/gat?

在项目目录运行 npm install @factorialco/gat,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 gat,可以用 npx gat 直接运行。

@factorialco/gat 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@factorialco/gat 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@factorialco/gat 可以商用吗?

@factorialco/gat 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@factorialco/gat 的下载量有多少?

根据 npm 官方下载统计,@factorialco/gat 在 2026/10/14 – 2026/11/12 这 30 天内被下载 18,537 次,日均约 618 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@factorialco/gat 还在维护吗?

最新版本 3.13.0 发布于 2026/10/16(29 天前);至今共发布 60 个版本,其中过去 12 个月发布了 5 个;首次发布于 2022/08/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。