在命令行里面准备起飞–解释来龙去脉
为什么有 clop
什么有 clop,先从官方库的弊端说起,现有开源库的现状。clop 要解决的问题。
官方库的弊端
- 不支持 posix 风格(最主要原因)
- 不能直接支持子命令
go 标准库其实有命令行解析器 flag 。但是他不支持 posix 风格命令行,对于命令行爱好者来说,不支持 posix 风格是相当不友好的。试问可以用cat -nT file 命令读取文件加行号,加行号,显示 tab 符号。用 flag 必须cat -n -T file ,你品,你细品。是不是,flag 开发的 cmd 应用直接没了 posix 那种感觉。当然后还有别的一些弊端,比如没有子命令直接支持等。
对主流开源命令行工具的思考
- 现有函数式接口缺点
go 里面主流命令行解析库,都是函数一把梭,如果代码按行计费,恩,他们赢面挺大。clop 的设计为什么采用 struct 形式。go 里面是强类型语言,相比 js, py 有数据模板–struct,你们写代码是不是经常传递 struct,确实 struct 是我们经常打交道的伙伴,如果用函数形式老大哥 viper 开发 cmd,你要先定义 struct->定义函数–配置一些形为,还要修改 struct 定义的地方。而使用 clop,只要定义 struct 。一看步骤就知道从 2 变成 1,这里面 struct 用法简化了函数式用法的步骤。
clop 要解决的问题
- 相比函数式,对复制粘贴友好
第一点,在对比函数式已经说明了只要定义结构体就行,如果要修改,被绑定的变量和 tag 在一行,怎么改也不容易出错,这就是对修改,和复制粘贴友好的原因,函数式:数据定义和使用隔的有点远,容易修改了 A 忘了修改 B 。
- posix 风格信徒
对一些新的 posix 风格也能支持到位
- 在实战中慢慢打磨 clop
后面的更新记录,时不时的会放出使用 clop 开发的 posix 命令。满血版本和你机器的 linux 有一样的功能,这次是 cat 命令啦。。。
clop 地址
https://github.com/guonaihong/clop
cat demo
完备版本 cat 实现
https://github.com/antlabs/cat
一个 easy demo
package main import ( "fmt" "github.com/guonaihong/clop" ) type Hello struct { File string `clop:"-f; --file" usage:"file"` } func main() { h := Hello{} clop.Bind(&h) fmt.Printf("%#vn", h) } // ./one -f test // main.Hello{File:"test"} // ./one --file test // main.Hello{File:"test"}