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

相关文章
|
消息中间件 关系型数据库 MySQL
Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)
Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)
|
程序员 Go
Golang深入浅出之-Select语句在Go并发编程中的应用
【4月更文挑战第23天】Go语言中的`select`语句是并发编程的关键,用于协调多个通道的读写。它会阻塞直到某个通道操作可行,执行对应的代码块。常见问题包括忘记初始化通道、死锁和忽视`default`分支。要解决这些问题,需确保通道初始化、避免死锁并添加`default`分支以处理无数据可用的情况。理解并妥善处理这些问题能帮助编写更高效、健壮的并发程序。结合使用`context.Context`和定时器等工具,可提升`select`的灵活性和可控性。
226 2
|
存储 NoSQL Java
如何在Java中使用MongoDB
如何在Java中使用MongoDB
|
机器学习/深度学习 数据采集 人工智能
机器学习在医疗诊断中的应用:开启智慧医疗新时代
【8月更文挑战第5天】机器学习革新医疗诊断,提升精准度与效率。通过分析医学影像和基因数据,实现疾病早期检测与个性化治疗。在药物研发中,加速候选药物筛选与优化过程。智能化患者管理及智能辅助决策系统进一步增强医疗服务质量。面对数据质量和隐私保护挑战,持续技术创新推动智慧医疗发展。
|
Linux 虚拟化
VMware虚拟机中Linux系统磁盘空间扩容实战
VMware虚拟机中Linux系统磁盘空间扩容实战
1170 0
|
Web App开发 JavaScript 前端开发
Vue系列教程(04)- VsCode断点调试(Debugger for Chrome)
Vue系列教程(04)- VsCode断点调试(Debugger for Chrome)
637 0
|
机器学习/深度学习 数据采集 数据挖掘
Python实现循环神经网络RNN-LSTM回归模型项目实战(股票价格预测)
Python实现循环神经网络RNN-LSTM回归模型项目实战(股票价格预测)
|
机器学习/深度学习 算法 自动驾驶
深度强化学习在大模型中的应用:现状、问题和发展
强化学习在大模型中的应用具有广泛的潜力和机会。通过使用强化学习算法,如DQN、PPO和TRPO,可以训练具有复杂决策能力的智能体,在自动驾驶、机器人控制和游戏玩家等领域取得显著成果。然而,仍然存在一些挑战,如样本效率、探索与利用平衡以及可解释性问题。未来的研究方向包括提高样本效率、改进探索策略和探索可解释的强化学习算法,以进一步推动强化学习在大模型中的应用。
3098 3
|
Java Spring
Command line is too long. Shorten command line for Application or also for Spring Boot default confi
Command line is too long. Shorten command line for Application or also for Spring Boot default confi
191 1
商标课堂开课啦——商标知多少?
商标课堂开课啦——商标知多少?
524 0
商标课堂开课啦——商标知多少?