go语言生成器code generator怎么使用


这篇文章主要介绍“go语言生成器codegenerator怎么使用”,在日常操作中,相信很多人在go语言生成器codegenerator怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言生成器codegenerator怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!client-go为每种k8s内置资源提供了对应的clientsetinformer。那么我们要监听和操作自定义资源对象,应该如何做呢?方式一:使用client-go提供的dynamicClient来操作自定义资源对象,当然由于dynamicClient是基于RESTClient实现的,所以我们可以使用RESTClient来达到同样的目的。方式二: 使用conde-generator来帮我们生成我们需要的代码,这样我们就可以像使用client-go为k8s内置资源对象提供的方式监听和操作自定义资源了。code-generator 就是 Kubernetes 提供的一个用于代码生成的项目,它提供了以下工具为 Kubernetes 中的资源生成代码:deepcopy-gen: 生成深度拷贝方法,为每个 T 类型生成 func (t* T) DeepCopy() *T 方法,API 类型都需要实现深拷贝client-gen: 为资源生成标准的 clientsetinformer-gen: 生成 informer,提供事件机制来响应资源的事件lister-gen: 生成 Lister,为 get 和 list 请求提供只读缓存层(通过 indexer 获取)Informer 和 Lister 是构建控制器的基础,使用这4个代码生成器可以创建全功能的、和 Kubernetes 上游控制器工作机制相同的 production-ready 的控制器。code-generator 还包含一些其它的代码生成器,例如 Conversion-gen 负责产生内外部类型的转换函数、Defaulter-gen 负责处理字段默认值。大部分的生成器支持–input-dirs参数来读取一系列输入包,处理其中的每个类型,然后生成代码:1、部分代码生成到输入包所在目录,例如 deepcopy-gen 生成器,也可以使用参数–output-file-base “zz_generated.deepcopy” 来定义输出文件名2、其它代码生成到 –output-package 指定的目录,例如 client-gen、informer-gen、lister-gen 等生成器接来下我们使用code-generator进行实战演示:首先我们将项目拉到本地:然后我们进入到cmd目录下,就会看到我们上面介绍的工具:接着我们对client-gen,deepcopy-gen,infromer-gen,lister-gen进行安装,会安装到GOPATH的bin目录下:发现我们已经成功的安装了,这时候我们就可以免费云主机域名直接使用这些工具了,比如我们可以使用--help命令来查看如何使用client-gen:当然通常情况下我们不会去单独的使用某一个工具。接下来我们来创建我们的项目,此处我们可以仿照sample controller项目进行编写:接下来我们对v1下面的三个go文件进行填充(可以直接复制sample-controller,对其进行做简单修改):doc.go主要是用来声明要使用deepconpy-gen以及groupName。types.go主要是定义crd资源对应的go中的结构。register.go顾名思义,就是注册资源。这时候会发现&Bar{},&BarLis{}会报错,这是因为我们还没有为其实现deepcopy方法。由于在自动生成代码的时候,需要指定header的信息,所以我们为了方便,可以将code-generator项目下的hack包直接拷贝到我们当前项目根目录下。接下来我们使用code-generator来为我们自动生成代码:这时候我们再来查看项目结构:这时候我们就可以像操作内置资源一样,操作我们的自定义资源了。我们先准备crd以及对应的cr,这边也是可以直接从sample-controller项目进行拷贝,做简单的修改即可。接下来我们来编写main函数,这时候我们就可以使用client-go像操作我们内置资源一样,操作crd资源了。在我们上面的示例中,我们在源码中添加了很多tag,我们使用这些tag来标记一些供生成器使用的属性。这些tag主要分为两类:在doc.go的package语句智商提供的全局tag在需要被处理的类型上提供局部tagtag的使用方法如下所示:我们可以看到 tag 是通过注释的形式存在的,另外需要注意的是 tag 的位置非常重要,很多 tag 必须直接位于 type 或 package 语句的上一行,另外一些则必须和 go 语句隔开至少一行空白。必须在目标包的doc.go文件中声明,一般路径为pkg/apis///doc.go,如下所示:注意:空行不能省略局部tag要么直接声明在类型之前,要么位于类型之前的第二个注释块中。下面的 types.go 中声明了 CR 对应的类型:在上面 CR 的定义上面就通过 tag 来添加了自动生成相关代码的一些注释。此外对于集群级别的资源,我们还需要提供如下所示的注释:另外我们还可以控制客户端提供哪些 HTTP 方法:使用 tag 定义完需要生成的代码规则后,执行上面提供的代码生成脚本即可自动生成对应的代码了。除了上面介绍的代码生成方式,我们还可以直接使用sample-controller项目提供的hack/update-condegen.sh脚本。执行上面的脚本后,所有 API 代码会生成在 pkg/apis 目录下,clientsets、informers、listers 则生成在 pkg/generated 目录下。不过从脚本可以看出需要将 code-generator 的包放置到 vendor 目录下面,现在我们都是使用 go modules 来管理依赖保,我们可以通过执行 go mod vendor 命令将依赖包放置到 vendor 目录下面来。我们还可以进一步提供 hack/verify-codegen.sh 脚本,用于判断生成的代码是否 up-to-date:到此,关于“go语言生成器codegenerator怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: python时间戳相减的示例分析

这篇文章主要为大家展示了“python时间戳相减的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python时间戳相减的示例分免费云主机域名析”这篇文章吧。在代码执行前后各记录一个时间点,两个时间戳相减即程…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/03 16:57
Next 05/03 16:57

相关推荐