什么有 clop,先从官方库的弊端说起,现有开源库的现状。clop 要解决的问题。
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 用法简化了函数式用法的步骤。
第一点,在对比函数式已经说明了只要定义结构体就行,如果要修改,被绑定的变量和 tag 在一行,怎么改也不容易出错,这就是对修改,和复制粘贴友好的原因,函数式:数据定义和使用隔的有点远,容易修改了 A 忘了修改 B 。
对一些新的 posix 风格也能支持到位
后面的更新记录,时不时的会放出使用 clop 开发的 posix 命令。满血版本和你机器的 linux 有一样的功能,这次是 cat 命令啦。。。
https://github.com/guonaihong/clop
完备版本 cat 实现
https://github.com/antlabs/cat
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("%#v\n", h)
}
// ./one -f test
// main.Hello{File:"test"}
// ./one --file test
// main.Hello{File:"test"}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.