cli - 构建强大命令行程序的工具箱 (1)

发布于:2017年08月07日 已被阅读

cli 简介

    `cli` 是一个简单易用的命令行程序开发工具。和标准库的flag相比,`cli` 提供了更加优雅的参数定义方式。`cli` 将参数定义放在一个结构体,每个字段代表一个flag,每个flag通过golang的tag来描述。支持的tag包括:    * cli - flag名    * usage - flag的使用说明    * dft - flag的默认值    * name - flag的引用显示名    举个栗子:

cli-1.PNG

    `cli` 支持一些丰富的特性以便于更加便捷的创建命令行应用程序。包括:    * N级子命令    * 子命令提示 - 如果有build的字名,那么键入`bui`就会得到错误,同时提示是否想要的是build    * HTTP路由到子命令 - /path/to/cmd -> path to cmd    * RPC - 远程调用,客户端服务器共享代码    * 参数定义支持结构体成员及继承    后续将陆续讲解`cli`的各个特性。今天将介绍如何利用`cli`开始一个应用程序的构建。

获取 cli

    cli 开源在 [github](https://github.com/mkideal/cli) 上,欢迎大家前去 star :-)    使用go get获取            go get github.com/mkideal/cli

cli 的 hello world

    先上一个图

cli-2.PNG

    看,就是这么简单。在终端上键入            go build -o hello    进行编译,然后运行            ./hello -h    输出如下:

cli-3.PNG

    1. 第4行引入 `cli` 包    2. 7~11行定义命令行参数 help(h),name,age(a)    3. 14行的`Run`函数接受两个参数:1)命令行参数对象;2)回调函数    4. 15行从回调函数的入参中取到解析后的命令行参数对象    5. 17行输出帮助说明    6. 18行执行我们的逻辑(这里只是输出一行文本)    函数 `cli.Run` 根据 os.Args[1:]解析参数到对象argT上,最后放在 `cli.Context` 中传回到回掉函数。

tag 介绍

cli

    `cli` 定义了flag的名字,支持单字符和多字符,用逗号分隔可定义多个名字,但不能重复,也不能和其他flag的的重复。    单字符名字在终端命令中加一个`-`,多字符的加两个`-`,像这样    ./hello -h    ./hello --help    `cli` tag前加`*`表示该flag是必须赋值的。像这样:    Name string `cli:"*name"`    `cli` tag 前加`!`表示如果该flag赋值为true,则不对参数做校验了,这一特性经常用于help参数。像这样:    Help bool `cli:"!h,help"`    `cli` tag 为 `-`时将不对其进行参数解。像这样:    Ignored string `cli:"-"`    如过参数定义中有`cli`为空或不存在的情形将使用字段名作为flag名。

usage

    `usage` 描述了flag的用法或说明

dft

    `dft` 指定flag的默认值。`dft`支持指定环境变量为默认值。比如    Home string `cli:"home" usage:"home dir" dft:"$HOME"`

name

    `name` 为flag去了一个在帮助中显示用的别名。

结束语

今天就介绍这些了。然后可以看看下面3个例子:

还可以使用工具 goplus 快速构建一个 cli 应用程序

    go get github.com/mkideal/goplus    goplus new <AppName>