- Kubernetes源码剖析
- 郑东旭
- 656字
- 2020-08-27 12:50:34
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代码文件。