您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

Go 编程:写一个程序友好的命令行工具包

时间:2020-01-26 12:34:12  来源:  作者:

以下文章来源于一艘慢船 ,作者JayL

 

Go 编程:写一个程序友好的命令行工具包

 

作为一名后端程序员,命令行程序太普遍了。如何开始一个类似的命令行程序的工具以及相关依赖包也非常多。个人最常使用的工具包是: spf13/cobra。 同时结合作者提供的spf13/viper包,命令行程序需要的绝大部分功能作者都替你想到了,基本上是没有必要重写一个新轮子了。

然而,即便是功能再齐全的包在个人使用的习惯与便利上还是因人而异的。虽然,通过cobra提供的命令行工具可以快速的启动一个命令行项目的框架代码,但是在多级命令的组织上,还可以在简洁一点,特别是对于子命令的操作,添加一个子命令必须指定对应的父级命令,逻辑上正确,但是使用上是不便的。

rootCmd.AddCommand(subCmd)
...
subCmd.AddCommand(subSubCmd)

cobra生成的代码中,不难发现类似以上的代码。在多级命令的组织上是非常机械。因为是生成代码,不需要手动编辑代码,所以这种不便很难直接感受到。但它提供的cobra工具是程序员友好的。

但是对于企业级命令行项目而言,不可能通过人工的方式通过cobra工具手动生成相应的命令行框架代码。而是需要直接将命令行代码集成的项目框架中去,所以就命令行相关代码而言,我们需要更加程序友好的工具包。

一个理想的命令行工具包,我认为可以是这样的:

整个包仅提供一个增加子命令的接口:Add, 通过option的方式,对具体命令行进行配置即可。特别是对于多级命令的设置上,我希望可以通过类似文件系统的目录结构的形式来定义具体的子级命令。

/			根命令
/foo		一级命令
/foo/bar  	二级命令
...

在使用上,可以是这样:

根命令行:

import (
"fmt"

"github.com/x-mod/cmd"
)

func main() {
	cmd.Add(
		cmd.Path("/"),
		cmd.Main(Main),
)
	cmd.Execute()
}

func Main(c *cmd.Command, args []string) error {
	fmt.Println("my root command running ...")
	return nil
}

多级命令行:

import (
"fmt"

"github.com/x-mod/cmd"
)

func main() {
	cmd.Add(
		cmd.Path("/foo/bar/v1"),
		cmd.Main(V1),
).PersistentFlags().StringP("parameter", "p", "test", "flags usage")
	cmd.Version("version string")
	cmd.Execute()
}

func V1(c *cmd.Command, args []string) error {
	fmt.Println("V1 called")
	return nil
}

在Bash中,命令行操作如下:

$: go run main.go foo bar v1
V1 called

当然,现实中我也是这么做的。具体工具包的实现,请参考: x-mod/cmd。有了这样一个程序友好的命令行工具包,下一步就是写一个项目框架的快速启动工具,将这个包用进去了。



Tags:Go 编程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作为一名后端程序员,命令行程序太普遍了。如何开始一个类似的命令行程序的工具以及相关依赖包也非常多。个人最常使用的工具包是: spf13/cobra。 同时结合作者提供的spf13/viper包,命令行程序需要的绝大部分功能作者都...【详细内容】
2020-01-26  Tags: Go 编程  点击:(65)  评论:(0)  加入收藏
▌简易百科推荐
goshop开源项目的更新 备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。感兴趣的可以点个star哦~gitee.com/jobhands...【详细内容】
2022-07-06  南方葵籽    Tags:Gorm   点击:(21)  评论:(0)  加入收藏
之前的一篇文章里,我提到了在VSCode和JetBrains之间反复横跳的事情,并且还觉得VSCode挺香的,Go、Python、Java等语言在VSCode中都可以获取到代码智能提示,不用死记硬背API了。没...【详细内容】
2022-06-29  BlackJ个啥    Tags:Go   点击:(70)  评论:(0)  加入收藏
构建方式对比于其他语言的程序,Go语言的跨平台能力是真的强,拿.Net和JAVA来说吧,.Net在.Net core出现之前是不能跨平台的,只能在windows上编译运行,即使是.net core出现以后,跨平...【详细内容】
2022-06-23  心有玲曦遇见你    Tags:Go语言   点击:(39)  评论:(0)  加入收藏
GO的全局变量很多从C++、C#等转过来做GO的初学小伙伴,都会发现同样一个疑问:就是GO中没有类似C++的静态变量。这就很纳闷了。有些配置数据,比如数据库的链接IP等,是需要全局共享...【详细内容】
2022-06-22  MEEGO    Tags:GO   点击:(60)  评论:(0)  加入收藏
Go 箴言 不要通过共享内存进行通信,通过通信共享内存 并发不是并行 管道用于协调;互斥量(锁)用于同步 接口越大,抽象就越弱 利用好零值 空接口 interface{} 没有任何类型约束 Gof...【详细内容】
2022-06-21  奇幻小鱼k    Tags:GO编程   点击:(39)  评论:(0)  加入收藏
协程(Goroutines)在Go语言中,每一个并发的执行单元叫作一个goroutine。,我们只需要通过 go 关键字来开启 goroutine 即可。goroutine 是轻量级线程,goroutine 的调度是由 Golang...【详细内容】
2022-06-20  VT漫步    Tags:go   点击:(27)  评论:(0)  加入收藏
golang基础语法Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 & 表达式 注释基本语法介绍...【详细内容】
2022-06-20  VT漫步    Tags:golang   点击:(14)  评论:(0)  加入收藏
开发环境IDE安装工欲善其事,必先利其器这里推荐两款golang开发工具,一个是goland,一个是VSCode;goland是收费的,收费还是有收费的道理,确实比较好用,个人比较推荐;VSCode需要安装插...【详细内容】
2022-06-15  VT漫步    Tags:golang   点击:(49)  评论:(0)  加入收藏
1. 函数传参 package mainimport "fmt"func main() { slice := []int{1, 2} fmt.Printf("data:%v, len:%d, cap:%d\n", slice, len(slice), cap(slice)) updateslice(slice)...【详细内容】
2022-06-08  顾明同学    Tags:golang   点击:(50)  评论:(0)  加入收藏
前几天有个同学想了解下如何在go-micro中做链路跟踪,这几天正好看到wrapper这块,wrapper这个东西在某些框架中也称为中间件,里边有个opentracing的插件,正好用来做链路追踪。ope...【详细内容】
2022-05-05  萤火架构    Tags:go-micro   点击:(61)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条