美文网首页
2022-04-11 go命令行库cobra-cli

2022-04-11 go命令行库cobra-cli

作者: 0619f9023a02 | 来源:发表于2022-04-12 11:21 被阅读0次

    一、基本概念

    cobra-cli 库是 golang 的一个开源第三方库,能够快速便捷的建立命令行应用程序。

    优势:cobra-cli 可以快速建立CLI程序,使我们更专注于命令需要处理的具体的业务逻辑。

    cobra-cli由三部分构成:commands,arguments 和 flags

    commands:表示要执行的动作。每一个 command 表示应用程序的一个动作。每个命令可以包含子命令。

    arguments:给动作传入的参数。

    flags:表示动作的行为。可以设置执行动作的行为。flags 包括两种:对某个命令生效和对所有命令生效。

    二、安装方法

    go install github.com/spf13/cobra-cli@latest

    三、使用方法

    1.创建项目文件夹,比如在$GOPATH/src下面创建cobraCliDemo项目文件夹

    2.在项目文件夹里面执行 go mod init <MODNAME>,比如go mod init cobraCliDemo

    3.执行cobra-cli init

    创建成功后项目目录如下:

    3.1、root.go代码如下:

    root.go代码中有一个rootCmd变量:

    Use: 命令。

    Short: 命令的简短描述。

    Long: 命令的详细描述,在帮助命令,如[appName] -h或者[appName] [command] -h时会显示此程序和此命令的字符串。

    Run: 命令执行入口,函数主要写在这个模块中。

    3.2、main.go代码如下:

    4、运行go build main.go,然后执行./main

    四、给项目添加命令

    1、项目添加命令

    比如在项目目录下面即main.go目录下面执行下面命令

    (1)、cobra-cli add serve:创建server命令

    (2)、cobra-cli add config:创建config命令

    (3)、cobra-cli add create -p 'configCmd':在configCmd命令下面创建create子命令create,即嵌套命令创建方式 cobra-ci add 子命令名字 -p  "父命令Cmd"

    代码如下:

    serve.go config.go create.go

    (4) 编译执行:go build main.go,然后执行./main

    config,serve为我们刚才创建的命令,执行./main serve,./main config进行调用

    2、为command(命令)添加选项(flags)

    flags用来控制命令的具体行为分为本地(local) flags和全局(persistent) flags两类。

    (1)全局选项persistent flags

    对于 persistent 类型的选项,既可以设置给该 Command,又可以设置给该 Command 的子 Command。

    a、使用PersistentFlags().String添加flags

    在root.go定义一个全局变量var foo *string,然后在root.go的init里面添加:

    foo =rootCmd.PersistentFlags().String("foo","defaultFo","A help for foo")

    执行go run main.go serve --foo fo,fo被赋值给foo;如果go run main.go serve,默认的defaultFo被赋值给foo,由此可见在父命令rootCmd定义的--foo全局flags在子命令serve里面也可以用,同理在子命令config和create里也可用,调用方式:go run main.go config --foo f,go run main.go config create --foo f。

    b、使用PersistentFlags().StringVar添加flags

    在root.go定义一个全局变量var print string,然后在root.go的init里面添加:

    rootCmd.PersistentFlags().StringVar(&print,"print","defaultPrint","print")

    执行go run main.go serve --foo fo --print p,fo被赋值给foo,p被赋值给print;如果go run main.go serve,默认的defaultFo被赋值给foo,defaultPrint赋值给print,由此可见在父命令rootCmd定义的--print全局flags在子命令serve里面也可以用,同理在子命令config和create里也可用,调用方式:go run main.go config --foo fo --print p,go run main.go config create --foo fo --print p。

    c、PersistentFlags().BoolVarP添加flags

    在root.go定义一个全局变量var show string,然后在root.go的init里面添加:

    // 下面定义了一个Flag show,show默认为false, 有两种调用方式--show\-w,命令后面接了show则上面定义的show变量就会变成true

    rootCmd.PersistentFlags().BoolVarP(&show,"show","w",false,"show")

    执行go run main.go serve --foo fo --print p -w,fo被赋值给foo,p被赋值给print,show为true;如果go run main.go serve,默认的defaultFo被赋值给foo,defaultPrint赋值给print,show为false,由此可见在父命令rootCmd定义的--w/--show全局flags在子命令serve里面也可以用,同理在子命令config和create里也可用,调用方式:go run main.go config --foo fo --print p -w ,go run main.go config create --foo fo --print p -w。

    运行go run main.go serve -h可以看到命令flags使用方式。

    (2)本地选项local flags

    local 类型的选项只能设置给指定的 Command。

    同理在serve.go的init添加下面代码设置本地flags。

    foo2 =serveCmd.Flags().String("foo2","fo2","help for foo2")

    serveCmd.PersistentFlags().StringVar(&print2,"print2","defaultPrint2","print2")

    serveCmd.Flags().BoolP("serve","s",false,"Help message for serve")

    执行go run main.go serve -h可以看到flags的使用方式:

    执行go run main.go serve -s或go run main.go serve --serve,serve命令被调用,输出:

    serve called foo: rr

    serve called print: defaultPrint

    serve called show: false

    serve called foo2: fo2

    serve.go serveCmd代码如下:

    3、获取命令行参数

    MinimumNArgs(int) 当参数数目低于配置的最小参数个数时报错 

     MaximumNArgs(int) 当参数数目大于配置的最大参数个数时报错 

     ExactArgs(int) 如果参数数目不是配置的参数个数时报错

    NoArgs            没有参数则报错 

    执行cobra-cli add path添加path命令 ,设置该命令需要且仅需要一个参数,并在Run方法中取出参数 ,代码如下:

    然后执行go run main.go path /bin,输出/bin

    代码下载:git@github.com:steven2008/go-cobra-cli.git

    相关文章

      网友评论

          本文标题:2022-04-11 go命令行库cobra-cli

          本文链接:https://www.haomeiwen.com/subject/oerisrtx.html