用途:本指南用于把 gh-aw 中的 JavaScript 代码重构为独立的 .cjs 文件,以便拆分大型脚本、便于测试与复用。gh-aw 在 GitHub Actions 工作流中使用 CommonJS 模块(.cjs),这些文件通过 //go:embed 嵌入 Go 二进制,并由自定义打包器内联本地 require() 调用,通过 actions/github-script@v8 执行。
顶层脚本模式:顶层 .cjs 脚本应导出 main 但不要调用它,正确写法为 async function main() { ... } 后跟 module.exports = { main };。不要在文件中直接 await main();,打包器会在内联执行时自动注入 await main()。这样脚本既能被测试导入,又能在工作流中执行。
使用方式:在 pkg/workflow/js/ 下创建新文件,文件名用 snake_case 加 .cjs 扩展名。文件应包含 // @ts-check 和 /// <reference types="@actions/github-script" />,用 JSDoc 注释,通过 module.exports 导出函数。不要导入 @actions/core 或 @actions/github,它们在 GitHub Actions 中全局可用。创建同名 .test.cjs 测试文件,使用 vitest,用动态 await import() 导入模块,并 mock core、github 全局对象。
嵌入与打包:共享工具函数加到 pkg/workflow/js.go,用 //go:embed 声明变量并加入 GetJavaScriptSources() 映射;主脚本加到 pkg/workflow/scripts.go,用 //go:embed 声明 xxxSource 变量,并用 sync.Once 模式创建打包 getter。共享工具加入映射后,其他脚本可用 require("./my_module.cjs") 引用,打包器会自动内联并去重。
常用命令:make fmt-cjs、make test-js、make test-unit、make build、make lint-cjs。修改嵌入文件后若未生效,可执行 make clean 再 make build。
限制与排查:缺失文件会报 required file not found in sources,需加入 GetJavaScriptSources() 映射;测试报 core is not defined 需在导入前设置全局 mock;循环依赖会导致打包失败,需重构拆分;日志解析脚本需在 GetLogParserScript() 中增加分支。官方文档未提供具体版本兼容性与平台限制信息。