在命令行里面准备起飞--解释来龙去脉

2020-05-12 13:12:27 +08:00
 guonaihong

为什么有 clop

什么有 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 用法简化了函数式用法的步骤。

clop 要解决的问题

第一点,在对比函数式已经说明了只要定义结构体就行,如果要修改,被绑定的变量和 tag 在一行,怎么改也不容易出错,这就是对修改,和复制粘贴友好的原因,函数式:数据定义和使用隔的有点远,容易修改了 A 忘了修改 B 。

对一些新的 posix 风格也能支持到位

后面的更新记录,时不时的会放出使用 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("%#v\n", h)
}
// ./one -f test
// main.Hello{File:"test"}
// ./one --file test
// main.Hello{File:"test"}
1095 次点击
所在节点    程序员
2 条回复
paoqi2048
2020-05-12 20:50:17 +08:00
这波直接起飞🛫
guonaihong
2020-05-13 13:34:57 +08:00
@paoqi2048 哈哈。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/670885

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX