2.6 代码生成过程

Kubernetes代码生成器包括deepcopy-gen、defaulter-gen、conversion-gen、openapi-gen、go-bindata等,代码生成过程如图2-4所示。

图2-4 代码生成过程

deepcopy-gen、defaulter-gen、conversion-gen、openapi-gen、go-bindata等代码生成器生成代码的流程基本相同,以deepcopy-gen代码生成器为例,生成过程可分为如下3步。

(1)构建deepcopy-gen二进制文件。

(2)生成.todo文件。

(3)生成DeepCopy(深复制)相关函数。

1.构建deepcopy-gen二进制文件

为方便读者理解Makefile.generated_files的代码生成过程,下面将Makefile.generated_files中的代码及“重要的调试信息”一并展示,使用“---------”符号进行分隔,代码示例如下:

hack/make-rules/build.sh构建脚本根据传入的代码生成器的main入口文件路径,构建二进制文件。

touch$@则更新deepcopy-gen代码生成器二进制文件的atime/mtime/ctime时间戳。

2.生成.todo文件

.todo文件相当于临时文件,用来存放被Tags标记过的包。通过shell的grep命令可以将所有代码包中被Tags标记过的包目录记录在.todo文件中,这样可方便记录哪些包需要使用代码生成功能,代码示例如下:

Makefile.generated_files中定义了ALL_K8S_TAG_FILES变量,其用于获取Kubernetes代码中被“/+k8s:”标签标记过的包;也定义了DEEPCOPY_DIRS变量,其用于从ALL_K8S_TAG_FILES中筛选出被“+k8s:deepcopy-gen”标签标记过的包。最终将筛选出的包目录路径输出到.todo文件中。下面列出deepcopy-gen.todo文件中的部分内容:

3.生成与深复制相关的函数

其中./hack/run-in-gopath.sh脚本用于设置临时Kubernetes GOPATH环境并在该临时环境下运行命令。

deepcopy-gen参数说明如下。

--v:指定日志级别。

--logtostderr:日志输出到“标准错误输出”。

-i,--input-dirs:输入源,即.todo文件中的目录列表,以逗号分隔。

--bounding-dirs:依赖的包并为其生成深复制的类型。

-O,--output-file-base:输出文件的名字。

deepcopy-gen代码生成器将.todo文件的内容作为输入源,对不同输入源生成DeepCopy相关函数,并输出至zz_generated.deepcopy.go文件。以k8s.io/kubernetes/pkg/apis/abac/v1beta1作为输入源手动进行测试,执行命令如下:

最终,我们在pkg/apis/abac/v1beta1/目录下得到了新生成的zz_generated.deepcopy.go代码文件。