使用Cli构建Go的命令行应用
在Go里面应用中flag这一标准库,提供了很多我们在写命令行时需要的interface,然而如果你需要更强大更好的结构,可以试一下cli.go这个库。
利用cli.go来写命令行应用
定义命令和子命令
下面是一个例子:
package main import (
"fmt"
"os" "github.com/codegangsta/cli"
) func main() {
app := cli.NewApp()
app.Name = "jasperapp"
app.Usage = "sample command-line app by jasper"
app.Author = "Carter"
app.Email = "jasper@xxx.com"
app.Commands = []cli.Command{
{
Name: "read",
ShortName: "r",
Usage: "read something",
Subcommands: []cli.Command{
{
Name: "articles",
Usage: "read articles",
Action: readArticles,
},
{
Name: "tweets",
Usage: "read Tweets",
Action: readTweets,
},
},
},
}
app.Run(os.Args)
} func readArticles(ctx *cli.Context) {
fmt.Println("Go to http://www.opscoder.info to read articles!")
} func readTweets(ctx *cli.Context) {
fmt.Println("Go to http://www.opscoder.info to read our tweets!")
}
如果你不带参数去运行,你将会得到下面的帮助信息:
NAME:
jasperapp - sample command-line app by jasper USAGE:
jasperapp [global options] command [command options] [arguments...] VERSION:
0.0.0 AUTHOR:
Carter - <jasper@xxx.com> COMMANDS:
read, r read something
help, h Shows a list of commands or help for one command GLOBAL OPTIONS:
--help, -h show help
--version, -v print the version
我们定义一个read子命令,它有articles和tweet两个命令:
jasperapp read articles
输出为:
Go to http://www.opscoder.info to read articles!
或是运行:
jasperapp read tweets
输出为:
Go to http://www.opscoder.info to read our tweets!
使用context
每个动作都有一个context,在下面的例子中函数readArticles和readTweets接收一个参数,我们可以这样使用:
func readArticles(ctx *cli.Context) {
fmt.Printf("The first argument was: %s", ctx.Args().First())
}
现在运行jasperapp read articles please将会输出:
The first argument was: please
使用flags
为了展示flags的用法,我们稍微修改一下tweets子命令:
{
Name: "tweets",
Usage: "read Tweets",
Flags: []cli.Flag{
cli.StringFlag{
Name: "account",
Value: "TheJasper",
Usage: "name of Twitter account",
},
},
Action: readTwitter,
},
其中readTweets函数这么写:
func readTwitter(ctx *cli.Context) {
fmt.Printf("Go to http://www.opscoder.info/%s to read tweets!", ctx.String("account"))
}
现在让我们编译结果并查看下tweets子命令的帮助信息:
jasperapp read tweets --help
输出如下:
NAME:
tweets - read Tweets USAGE:
command tweets [command options] [arguments...] OPTIONS:
--account 'TheJasper' name of Twitter account
现在让我们试试:
$ jasperapp read tweets
Go to http://www.opscoder.info/TheJasper to read tweets! $ jasperapp read tweets --account codegangsta
Go to http://www.opscoder.info/codegangsta to read tweets!
总结
Cli.go还有很多自定义的东西,具体可以参考Godoc的文档。
使用Cli构建Go的命令行应用的更多相关文章
- CLI:使用Go开发命令行应用
原文地址 CLI或者"command line interface"是用户在命令行下交互的程序.由于通过将程序编译到一个静态文件中来减少依赖,一次Go特别适合开发CLI程序.如 ...
- php cli模式学习(PHP命令行模式)
http://www.jb51.net/article/37796.htm php_cli模式简介 php-cli是php Command Line Interface的简称,如同它名字的意思,就是 ...
- php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数
在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法1.直接使用argv变量数组. 2.使用$_SER ...
- Azure CLI 2.0-Azure新命令行工具介绍
Azure CLI 2.0 是 Azure 的新命令行体验,用于管理 Azure 资源. 可以将其安装在 macOS.Linux 和 Windows 上,然后从命令行运行它. Azure CLI 2. ...
- 4 个用于构建优秀的命令行用户界面的 Python 库
作者: Amjith Ramanujam 译者: LCTT Lv Feng 在这个分为两篇的关于具有绝佳命令行界面的终端程序的系列文章的第二篇教程中,我们将讨论 Prompt.Toolkit.Clic ...
- 构建一个Flowable命令行应用
官网链接 [(https://flowable.com/open-source/docs/bpmn/ch02-GettingStarted/#building-a-command-line-appli ...
- C++/cli中swtich处理命令行接收到的关键字
QQ群友中有人提出这样一个问题: Swtich接受的是整形或枚举类型, 关键字多数是一个字符, 将string转换成char就应该可以, 所以我试着写了一下代码, 直接提取string的第一个字符, ...
- Apache Commons CLI命令行启动
今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...
- golang常用库:cli命令行/应用程序生成工具-cobra使用
golang常用库:cli命令行/应用程序生成工具-cobra使用 一.Cobra 介绍 我前面有一篇文章介绍了配置文件解析库 Viper 的使用,这篇介绍 Cobra 的使用,你猜的没错,这 2 个 ...
随机推荐
- Java-IO之BufferedInputStream(缓冲输入流)
BufferedInputStream是缓冲输入流,继承于FilterInputStream,作用是为另一个输入流添加一些功能,本质上是通过一个内部缓冲数组实现的.例如,在新建某输入流对应的Buffe ...
- eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样
eclipse new server Cannot create a server using the selected type 网上有两种办法,其实原理一样 第一种说法: 还真的找到解决的方法了, ...
- 仿iphone快速导航悬浮球
用过iphone的朋友都知道,iPhone有个圆球辅助工具,它漂浮在你的手机屏幕(在任何APP之上),你可以将它移动到任何地方,它叫做AssistiveTouch,本篇模拟该软件实现一个小案例,主要是 ...
- TCP/IP入门(4) --应用层
/** 本篇博客由汗青ZJF整理并发布, 转载请注明出处: http://blog.csdn.net/zjf280441589/article/category/1854365 */ TCP/IP中的 ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
- Linux0.11中对文本文件进行修改的策略
现在,假设 hello.txt 是硬盘上已有的一个文件,而且内容为 "hello, world" ,在文件的当前指针设置完毕后,我们来介绍 sys_read , sys_write ...
- JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别
JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间 ...
- 抓包工具Fidder详解
第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 现在这个下载链接失效了,可以百度下载 第二步:设置Fid ...
- org/w3c/dom/ElementTraversal 错误解决办法
org/w3c/dom/ElementTraversal 错误解决办法 不记得之前几天把什么maven依赖包删除了,今天利用htmlunit运行代码的时候报了下面的错误: Exception in t ...
- Css技术入门笔记02
第一篇见Css入门笔记01http://blog.csdn.net/qq_32059827/article/details/51406674 4.其他选择器 4.1.关联选择器 有时在页面上会出现我们 ...