如何基于.json和.gotmpl文件生成go-freeipa的generated.go文件?
解决go-freeipa适配FreeIPA 4.10的代码生成问题
你遇到的json: cannot unmarshal string into Go struct field CertRequestResult.result.value of type int错误,确实是因为go-freeipa默认基于FreeIPA 4.9(API 2.170)生成的代码中,证书请求返回的value字段类型为int,而FreeIPA 4.10返回的是字符串类型的证书ID。下面是正确生成适配FreeIPA 4.10代码的步骤:
前置准备
- 已克隆go-freeipa仓库到本地
- 安装Go 1.16及以上版本
- 拥有FreeIPA 4.10实例的访问权限(用于获取最新API schema)
代码生成步骤
这个仓库的gen是自定义的代码生成工具,和clipperhouse/gen、go generate默认逻辑无关,按以下步骤操作:
补全仓库依赖
进入go-freeipa仓库根目录,执行:go mod tidy这会拉取所有第三方依赖,同时让gen工具能正确引用仓库内定义的
Schema、Command等核心类型(之前直接运行go run main.go报错就是因为这些类型未被正确引用)获取FreeIPA 4.10的API Schema
从运行的FreeIPA 4.10实例获取最新的schema JSON文件:# 替换为你的FreeIPA服务器地址、管理员账号密码 curl -k -u admin:your-password https://your-freeipa-server/ipa/schema > gen/schema.json如果没有可用实例,也可以从FreeIPA官方源码仓库的对应版本分支中下载schema文件,替换gen目录下的原schema.json
运行自定义gen工具生成代码
在仓库根目录执行以下命令,工具会读取gen目录下的schema.json和模板文件,生成freeipa/generated.go:go run gen/main.go
验证与适配
- 打开生成的
freeipa/generated.go,搜索CertRequestResult结构体,确认value字段类型已改为string - 在freeipa-issuer项目中,将go-freeipa依赖替换为你本地修改后的版本:
在freeipa-issuer的go.mod文件中添加:
然后执行replace github.com/StefanAbl/go-freeipa => /path/to/your/local/go-freeipago mod tidy,重新编译部署即可解决反序列化错误
内容的提问来源于stack exchange,提问作者Anghille
相关产品推荐
相关产品推荐

