4.1. [kustz] 使用 cobrautils 为命令添加更实用的命令参数

简介: 使用 cobrautils 库丰富命令行参数, 实现命令行工具的便捷性

4.1. [kustz] 使用 cobrautils 为命令添加更实用的命令参数

大家好, 我是老麦。

image.png

之前的章节, 我们陆陆续续给 kustz 库添加了很多丰富服务的配置

代码还是放在 Github
https://github.com/tangx/kustz/tree/chapter/12-cobrautils-flag

kustz 命令

但 kustz 命令, 还是处于一个很原始的命令状态。
接下来我们给 kustz 添加一些更丰富的参数 , 使 kustz 用起来更顺手。

在 CICD 的中, 一般情况下 变量,健康检查, 镜像策略 等很难发生变动。 而镜像名称 经常性 的在每次打包后发生变化。

每次CI触发都去修改 kustz.yml 配置显然是不可能的。 因此, 我们需要绑定更丰富的参数来支持我们 CI 的运行。

cobra flag

之前在 /cmd/kustz/cmd/render.go 中, 我们为命令添加了一个指定配置文件的参数。

func init() {
    cmdRender.Flags().StringVarP(&config, "config", "c", "kustz.yml", "kustz config")
}

var config string

这种方法是 cobra 官方提供的基本模式。 在绑定的时候, 需要一行写一个, 并且不支持 指针参数

cobrautils 库

接下来我们使用自己封装的 cobrautils 库。

$ go get -u github.com/go-jarvis/cobrautils

详细描述参考 https://github.com/go-jarvis/cobrautils

func init() {
    cobrautils.BindFlags(cmdRender, flags)
}

// KustzFlag 定义 flag
type KustzFlag struct {
    Config   string `flag:"config" usage:"kustz config" shorthand:"c"`
    Image    string `flag:"image" usage:"image name"`
    Replicas *int   `flag:"replicas" usage:"pod replicas number"`
}

// 初始化默认值
var flags = &KustzFlag{
    Config: "kustz.yml",
}

可以看到, 使用 cobrautils 之后。

  1. 使用结构体组合了所有参数, 每个字段通过注释描述, 作用更清晰, 耦合度更高。
  2. 支持 指针参数, 解决了 零值 带来的负面影响。
  3. 一行命令解决了所有参数的绑定。
其实如果喜欢的话, 可以将 /pkg/kustz/kustz.go 中的完整 Config 做成参数。

/cmd/kustz/cmd/render.go 中, 将 Image, Replicas 两个参数注入到配置文件中即可。


func render() {
    kz := kustz.NewKustzFromConfig(flags.Config)

    if flags.Image != "" {
        kz.Service.Image = flags.Image
    }
    if flags.Replicas != nil {
        kz.Service.Replicas = int32(*flags.Replicas)
    }

    kz.RenderAll()
}

image.png

相关文章
|
存储 NoSQL Java
如何在Java中使用MongoDB
如何在Java中使用MongoDB
|
Linux 虚拟化
VMware虚拟机中Linux系统磁盘空间扩容实战
VMware虚拟机中Linux系统磁盘空间扩容实战
1882 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的防疫物资管理信息系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的防疫物资管理信息系统附带文章源码部署视频讲解等
128 0
|
XML 存储 分布式数据库
数据库主流技术
数据库主流技术
510 4
|
机器学习/深度学习 数据采集 人工智能
机器学习在医疗诊断中的应用:开启智慧医疗新时代
【8月更文挑战第5天】机器学习革新医疗诊断,提升精准度与效率。通过分析医学影像和基因数据,实现疾病早期检测与个性化治疗。在药物研发中,加速候选药物筛选与优化过程。智能化患者管理及智能辅助决策系统进一步增强医疗服务质量。面对数据质量和隐私保护挑战,持续技术创新推动智慧医疗发展。
商标课堂开课啦——商标知多少?
商标课堂开课啦——商标知多少?
637 0
商标课堂开课啦——商标知多少?
|
存储 算法
【数据结构与算法】单链表的增删查改(附源码)(上)
【数据结构与算法】单链表的增删查改(附源码)
245 0
|
存储 JavaScript 前端开发
从null、undefined、NaN的区别了解JS的原型链
由于在面试经常会遇到问题null,undefined,NaN之间的区别,因此想要深入且系统了解一下这些代表空之间的区别,以及它们底层的原理——原型链,同时还要搞明白__proto__和prototype分别是什么。
499 0
编写一个函数,并用该函数编写100-200的素数
编写一个函数,并用该函数编写100-200的素数
149 0
编写一个函数,并用该函数编写100-200的素数
WiFi开发板使用指南
WiFi开发板是基于RTL8710BN方案的WiFi模块。该模块已经将所有可供用户使用的IO资源引出,便于客户使用。用户可直接通过USB口对开发板进行调试和烧录,并可使用开发板引出的各种接口进行功能开发和测试。
WiFi开发板使用指南