开发指南¶
本项目构建的是一个携带 Terraform 共享库的 Python 包。Python 代码位于
src/libterraform,构建共享库需要的 Go 源码会在 wheel 构建阶段从
upstream/ 和 native/go/ 组合生成。
环境要求¶
- Python 3.9 到 3.14
- Go 1.21.5 或更新版本
- 支持 CGO 的 C 编译器
uv
初始化¶
初始化 upstream 子模块:
安装 Python 开发依赖:
Makefile 会同时安装本地 Git hooks:
构建¶
从源码树运行会导入 libterraform 的测试前,需要先构建 wheel,因为
src/libterraform/__init__.py 在导入时会加载已编译的共享库:
Hatch 构建 hook:
- 将
native/go/plugin_patch.go复制到upstream/go-plugin/。 - 在
upstream/terraform/go.mod中添加临时的 go-pluginreplace指令。 - 将
native/go/libterraform.go复制到upstream/terraform/。 - 执行
go build -buildmode=c-shared。 - 将生成的共享库移动到
src/libterraform/。 - 恢复临时修改的 upstream 文件。
如需在 macOS 上交叉构建 x86_64 共享库,可以设置 TARGET_ARCH=amd64。
测试和检查¶
运行测试:
或使用 Make:
运行 Python 静态检查和 Go 桥接代码格式检查:
格式化 Python 文件和项目自有 Go 桥接文件:
测试套件使用 tests/tf/ 下的 Terraform fixtures。部分测试会执行真实的
Terraform state 行为,因此请先构建 wheel,并在发现测试失败时检查 stderr,
不要假设失败仅由 Python 引起。
文档站¶
文档站使用 Zensical 和 mkdocstrings。英文和中文分别作为独立 Zensical 项目构建,最终合并到同一个 GitHub Pages artifact。
本地预览:
按 CI 严格模式构建:
英文站点写入 site/,中文站点写入 site/zh/。GitHub Pages workflow 会在
推送到 main 后部署合并后的 site/ artifact。
仓库结构¶
src/libterraform/ Python 包和公开 API
native/go/ 构建时复制的 Go 桥接文件
upstream/terraform/ Terraform submodule
upstream/go-plugin/ 构建时会被临时 patch 的 go-plugin submodule
tests/ Python 测试和 Terraform fixtures
scripts/ 构建、发布和校验脚本
docs/ 项目文档
更新 Terraform 版本¶
版本线策略见 发布策略。实际更新 Terraform 时通常需要:
- 更新
release-matrix.json。 - 更新
src/libterraform/__init__.py。 - 更新
tests/consts.py。 - 更新 README 示例和版本对应表。
- 将
upstream/terraform/移动到目标 Terraform tag。 - 将
upstream/go-plugin/移动到upstream/terraform/go.mod要求的 go-plugin 版本。 - 运行矩阵校验、测试和 wheel 构建:
故障排查¶
如果导入 libterraform 时提示共享库缺失,先构建 wheel,或安装包含
libterraform.so / libterraform.dll 的已构建包。
如果构建 hook 报告缺少 upstream 目录,先初始化 Git submodule。
如果 Terraform 命令测试因为 provider 或 state 输出差异失败,使用 -vv
运行单个失败测试,并检查 CommandResult.error 或捕获的 stderr。Python
包装层主要负责参数转换和 stdout 解析,底层行为仍由 Terraform 决定。