为什么要使用命令行

觉得这个问题不应该列出来,又觉得如果初次进行WEB开发的话,可能会觉得所有的东西都可以使用API去做,会觉得命令行没有必要。

其实,一个生产的项目命令行是绕不过去的。比如运营需要导出报表、统计下付费用户、服务不稳定修改下订单状态等等,再者,命令行的工具基本都是内部使用,调试日志可以随意点,退一万步来说,即使有问题了,还可以再次修改。不像API是是随机性的,有些业务发生错误和异常是随机的、不可逆的。

怎么使用cli

这个主要看下使用案例就一目了然了。

首先下载类库包

go get github.com/urfave/cli

main.go

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/urfave/cli"
  6. )
  7. func main() {
  8. app := cli.NewApp()
  9. app.Commands = []cli.Command{
  10. {
  11. Name: "test",
  12. Usage: "test --uid=x --username=y",
  13. Action: (&Command{}).Test,
  14. Flags: []cli.Flag{
  15. cli.IntFlag{Name: "uid",Usage:"--uid"},
  16. cli.StringFlag{Name:"username",Usage:"--username"},
  17. },
  18. },
  19. }
  20. err := app.Run(os.Args)
  21. if err != nil {
  22. fmt.Print("command error :" + err.Error())
  23. }
  24. }

command.go

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/urfave/cli"
  5. )
  6. type Command struct {
  7. }
  8. func (this *Command) Test(cli *cli.Context) {
  9. uid := cli.Int("uid")
  10. username := cli.String("username")
  11. fmt.Println(uid,username)
  12. }

编译运行

  1. go build -o test.bin
  2. ./test.bin
  3. NAME:
  4. test.bin - A new cli application
  5. USAGE:
  6. test.bin [global options] command [command options] [arguments...]
  7. VERSION:
  8. 0.0.0
  9. COMMANDS:
  10. test test --uid=x --username=y
  11. help, h Shows a list of commands or help for one command

执行命令看下结果

  1. ./test.bin test --uid=110 --username=feixiang
  2. 110 feixiang

就是这么简单

可以再看看子命令

  1. func main() {
  2. app := cli.NewApp()
  3. app.Commands = []cli.Command{
  4. {
  5. Name: "test",
  6. Usage: "test1 --uid=x --username=y|test2 --uid=x --username=y",
  7. Subcommands:[]cli.Command{
  8. {
  9. Name: "test1",
  10. Usage: "test1 --uid=x --username=y",
  11. Action: (&Command{}).Test,
  12. Flags: []cli.Flag{
  13. cli.IntFlag{Name: "uid",Usage:"--uid"},
  14. cli.StringFlag{Name:"username",Usage:"--username"},
  15. },
  16. },
  17. {
  18. Name: "test2",
  19. Usage: "test2 --uid=x --username=y",
  20. Action: (&Command{}).Test,
  21. Flags: []cli.Flag{
  22. cli.IntFlag{Name: "uid",Usage:"--uid"},
  23. cli.StringFlag{Name:"username",Usage:"--username"},
  24. },
  25. },
  26. },
  27. },
  28. }
  29. err := app.Run(os.Args)
  30. if err != nil {
  31. fmt.Print("command error :" + err.Error())
  32. }
  33. }

编译运行看下结果

  1. go build -o test.bin
  2. ./test.bin test test1 --uid=111 --username=hello
  3. 111 hello
  4. ./test.bin test test2 --uid=111 --username=hello
  5. 111 hello

就是再加了一层命令

命令行的使用比较简单。基本也没有需要注意的。

如果需要了解更详细的使用,看下文档

https://github.com/urfave/cli

golang开发:类库篇(三)命令行工具cli的使用的更多相关文章

  1. golang开发:类库篇(五)go测试工具goconvey的使用

    为什么要使用goconvey测试程序 goconvey 集成go test,go test 无缝接入.管理运行测试用例,而且提供了丰富的函数断言.非常友好的WEB界面,直观的查看测试结果. 如果没有g ...

  2. 使用.Net Core编写命令行工具(CLI)

    命令行工具(CLI) 命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行. 通常认为,命令行工具(CLI)没有 ...

  3. commanderJs编写命令行工具(cli)

    前言: 最近需要做一个内部的node cli来独立构建流程,对整个命令行工具实现流程有了大致了解,下面来解释一下如何实现一个cli,和如何使用 commander 库.   新手误区: 在开始实现之前 ...

  4. golang开发:类库篇(一) Zap高性能日志类库的使用

    为什么要用zap来写日志 原来是写PHP的,一直用的error_log,第一次写Go项目的时候,还真不知道该怎么写日志,后来就按照PHP的写法自己不成规范的捣鼓写.去了新公司之后,发现用的是zap.后 ...

  5. golang开发:类库篇(四)配置文件解析器goconfig的使用

    为什么要使用goconfig解析配置文件 目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量.例如,生产环境跟测试环 ...

  6. golang开发:类库篇(二) Redis连接池的使用

    为什么要使用连接池 一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源.所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接 ...

  7. Flask内置命令行工具—CLI

    应用发现 flask命令在Flask库安装后可使用,使用前需要正确配置FLASK_APP环境变量以告知用户程序所在位置.不同平台设置方式有所不同. Unix Bash (Linux, Mac, etc ...

  8. Apache Commons CLI 开发命令行工具示例

    概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...

  9. SpringBootCLI 命令行工具

    Spring Boot CLI 是用于快速开发 Spring 应用的命令行工具.用来运行 Groovy (与 Java 风格类似)脚本. spring-cli 似乎不是可以各种diy spring-b ...

随机推荐

  1. MVC EF 导航属性

    @model IQueryable<EFExam.Models.CategoryProductViewModel>@{    Layout = null;}<!DOCTYPE htm ...

  2. Hutool 3.0.8 发布,Java 工具集

    Hutool 是一个Java工具包,提供了丰富的文件.日期.日志.正则.字符串.配置文件等工具方法,并封装了一套简单易用的ORM框架. 主页:http://hutool.cn/ 文档:http://h ...

  3. wpf的webbrowser与javascript交互

    JS调用C#代码 HTML代码: <button onclick="window.external.Test('called from script code')"> ...

  4. 重写combobox模板,实现支持过滤的combobox

    先看效果图 客户提出需求后,首选在百度查找可靠方案 看了几个,效果都不理想, 大多是把isEditNable设置成true,IsTextSearchNable设置成false 再对itemsSourc ...

  5. QEventLoop的全部源码也不多,混个脸熟

    /**************************************************************************** ** ** Copyright (C) 20 ...

  6. Win8 Metro(C#)数字图像处理--2.74图像凸包计算

    原文:Win8 Metro(C#)数字图像处理--2.74图像凸包计算 /// <summary> /// Convex Hull compute. /// </summary> ...

  7. Windows 10开发基础——XML和JSON (一)

    主要内容: JSON的序列化与反序列化 XML的序列化与反序列化 1.JSON的序列化与反序列化     JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,它 ...

  8. How to manipulate pixels on a bitmap by scanline property(Ma Xiaoguang and Ma Xiaoming)

    We have been developing image processing software for above 14 years with old versions of Delphi, su ...

  9. 算法之--回溯法-迷宫问题【python实现】

    题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0,  ...

  10. 改善C#程序的建议1:非用ICloneable不可的理由

    原文:改善C#程序的建议1:非用ICloneable不可的理由 好吧,我承认,这是一个反标题,实际的情况是:我找不到一个非用ICloneable不可的理由.事实上,接口ICloneable还会带来误解 ...