资讯动态

Terraform 如何用 go generate 与 make protobuf 重新生成代码

发布时间:2026/9/9 14:08:43 来源:尧图企业网站定制
Terraform 如何用 go generate 与 make protobuf 重新生成代码【免费下载链接】terraformTerraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.项目地址: https://gitcode.com/GitHub_Trending/te/terraform在修改 Terraform 核心源码时你会遇到一类不能手写的文件它们由生成工具产出提交前需要按项目约定重新生成否则代码与源定义不一致。Terraform 仓库把这类生成步骤分成两条独立路径绝大多数生成文件通过标准的go generate指令维护而 Protocol Buffers 桩代码provider 插件协议、RPC API 等则通过make protobuf单独处理。本文说明如何判断该走哪条路径、两条路径各自的执行命令以及如何验证生成结果符合预期。适用前提你已在本地克隆 Terraform 仓库并准备修改其中含生成代码的部分例如修改了.proto接口定义或需要更新stringer、mockgen生成的文件。仓库的 CONTRIBUTING 文档 说明 Terraform 开发环境目前只针对 Linux 和 Mac OS X 系统单元测试套件含 Unix 特有的路径假设。判断该用哪条生成路径仓库根目录的 Makefile 对两条路径有明确注释generate目标运行go generate来构建所有动态生成的源文件除了 protobuf 桩文件后者用make protobuf构建。分离的原因是Terraform 大多数开发任务不涉及修改 protobuf 文件而protoc不是go get能装的 Go 依赖手动安装不便。具体到文件go generate路径源码中带有//go:generate指令的文件。这类指令大量使用golang.org/x/tools/cmd/stringer为枚举类型生成String()方法产出如*_string.go文件和go.uber.org/mock/mockgen生成 mock 实现例如 internal/plugin/mock_proto/generate.go。工具依赖由 tools/tools.go 统一声明通过go tool调用。make protobuf路径各目录下的.proto定义文件及对应的*.pb.go/*_grpc.pb.go桩代码例如 internal/tfplugin5/tfplugin5.proto、internal/plans/planproto/planfile.proto、internal/rpcapi/terraform1/terraform1.proto。只有当你的改动触及相应源定义.proto文件、被stringer/mockgen覆盖的类型时才需要重新生成普通的业务代码改动不需要执行这些命令。准备条件按 BUILDING.md 与 CONTRIBUTING.md 的说明安装 Go 编译器。当前 go.mod 声明的最低兼容版本为go 1.26.4自 Go 1.21 起go命令会自动安装go.mod指定的较新工具链。仓库另以.go-version文件记录生产构建实际使用的版本可参照该文件选择本地版本。用 Git 克隆仓库到一个你选择的位置。Terraform 使用 Go Modules不要克隆到GOPATH内部。开始改动前先运行单元测试套件确认环境初始是通过的CONTRIBUTING.md 的建议go test ./...路径一用 go generate 重新生成普通生成文件在仓库根目录执行go generate ./...或等价的 Make 目标make generate两者执行的是同一条命令。go generate会扫描所有包中的//go:generate指令并逐条执行例如//go:generate go tool golang.org/x/tools/cmd/stringer -typeResourceMode //go:generate go tool go.uber.org/mock/mockgen -destination mock.go github.com/hashicorp/terraform/internal/tfplugin5 ProviderClient,...这些指令使用go tool调用工具工具版本由 Go 模块体系go.mod 与 tools/tools.go决定不需要你单独安装。执行完成后用git diff检查改动是否为预期结果CONTRIBUTING.md 明确要求这一步。路径二用 make protobuf 重新生成 protobuf 桩代码在仓库根目录执行make protobuf该目标实际运行go run ./tools/protobuf-compile .见 Makefile。从 tools/protobuf-compile/protobuf-compile.go 的实现可以看到它做了三件事准备 protoc源码中固定常量protocVersion 29.3对应 protoc v5.29.3与 terraform-plugin-go 当前使用的版本一致。首次运行会通过 go-getter 从 protoc 官方 release 下载对应平台的压缩包解压到tools/protobuf-compile/.workdir/protoc-v29.3/已存在则直接复用。构建 Go 插件用go build从当前go.mod的版本构建google.golang.org/protobuf/cmd/protoc-gen-go和google.golang.org/grpc/cmd/protoc-gen-go-grpc两个可执行文件。注释说明想升级这两个工具时按 Go 模块的常规方式升级模块即可。逐目录运行 protoc内置一张protocSteps列表对每个.proto文件用本地化的 protoc 加对应的--go_out/--go-grpc_out参数重新生成桩代码覆盖internal/tfplugin5、internal/tfplugin6、internal/rpcapi/terraform1及其setup、dependencies、stacks、packages子目录、internal/plans/planproto、internal/stacks/tfstackdata1、internal/cloudplugin/cloudproto1、internal/stacksplugin/stacksproto1、internal/policy/proto等目录。生成结果写在各.proto文件同目录下*.pb.go、*_grpc.pb.go。注意一个文档表述与实际执行差异CONTRIBUTING.md 的 Generated Code 一节的说法是 protobuf 生成 requires that youve already installed a suitable version ofprotoc但make protobuf真正执行的 wrapper 工具会自行下载并固定使用 protoc v29.3不依赖你系统上已安装的 protoc。以实际执行路径为准即可无需手动安装 protoc。验证结果两条路径生成完成后按文档给出的方式核对检查 diff运行git diff确认变更只落在预期的生成文件中*_string.go、mock.go、*.pb.go等且内容符合你对源定义的修改预期。CONTRIBUTING.md 明确建议 Usegit diffafterwards to inspect the changes and ensure that they are what you expected。跑单元测试重新执行go test ./...如果只改了特定包可以缩小范围加快循环例如go test ./internal/addrsCONTRIBUTING.md 要求在改动过程中持续保持测试套件通过改动接口导致测试失效时需要先修复测试再提交。限制与失败处理平台限制protoc官方 release 只覆盖了部分平台wrapper 工具只支持linux_amd64、linux_arm64、darwin_amd64、darwin_arm64安装 x86_64 包并依赖 Rosetta 转译、windows_amd64。源码注释 说明在这些以外的平台上工具会失败此时要么换到受支持的平台运行要么自行编译安装 protoc 后手动复现 wrapper 工具所执行的步骤。单步失败不会中断工具对每一步 protoc 的执行失败只记录failed to compile日志并继续后续步骤所以执行结束后要自己用git diff和测试确认所有目标文件都已正确更新。Make 不支持并行Makefile 用.NOTPARALLEL禁用了-j并行因为部分构建命令会创建在并行下互相冲突的临时文件运行make generate/make protobuf时不要加-j。下一步生成结果通过 diff 检查和测试验证后就按 CONTRIBUTING.md 的 PR 流程提交如果改动是面向用户的还需按该文档用npx changie new创建 change file。【免费下载链接】terraformTerraform enables you to safely and predictably create, change, and improve infrastructure. It is a source-available tool that codifies APIs into declarative configuration files that can be shared amongst team members, treated as code, edited, reviewed, and versioned.项目地址: https://gitcode.com/GitHub_Trending/te/terraform创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价