05 编写命令行工具

使用这个cobra这个库。

cobra 中有个重要的概念,分别是:

  • commands:代表行为
  • arguments :命令行参数(或者称为位置参数)
  • flags:flags 代表对行为的改变(也就是我们常说的命令行选项)

执行命令行程序时的一般格式为:

APPNAME COMMAND ARG --FLAG

arguments

首先来搞清楚命令行参数(arguments)与命令行选项的区别(flags/options)。

以常见的 ls 命令来说,其命令行的格式为:

ls [OPTION]... [FILE]# OPTION 对应本文中介绍的 flags,以 - 或 -- 开头
# FILE 则被称为参数(arguments)或位置参数

一般的规则是参数在所有选项的后面,上面的 … 表示可以指定多个选项和多个参数。

cobra 默认提供了一些验证方法:

  • ExactArgs(int) : 必须有 N 个位置参数,否则报错
  • ExactValidArgs(int) :必须有 N 个位置参数,且都在命令的 ValidArgs 字段中,否则报错
  • MaximumNArgs(int) : 如果位置参数超过 N 个将报错
  • MinimumNArgs(int) : 至少要有 N 个位置参数,否则报错
  • RangeArgs(min, max) : 如果位置参数的个数不在区间 min 和 max 之中,报错

比如要让 Command cmdTimes 至少有一个位置参数,可以这样初始化它:

var cmdTimes = &cobra.Command{
    Use: 
    Short: 
    Long: 
    Args: cobra.MinimumNArgs(1),
    Run: 
}

flags

选项(flags)用来控制 Command 的具体行为。根据选项的作用范围,可以把选项分为两类:

  • persistent
  • local

persistent

对于 persistent 类型的选项,既可以设置给该 Command,又可以设置给该 Command 的子 Command。对于一些全局性的选项,比较适合设置为 persistent 类型,比如控制输出的 verbose 选项:

var Verbose bool
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")

local

local 类型的选项只能设置给指定的 Command,比如下面定义的 source 选项:

var Source string
rootCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
// 该选项不能指定给 rootCmd 之外的其它 Command

默认情况下的选项都是可选的,但一些用例要求用户必须设置某些选项,这种情况 cobra 也是支持的,通过 Command 的 MarkFlagRequired 方法标记该选项即可:

var Name string
rootCmd.Flags().StringVarP(&Name, "name", "n", "", "user name (required)")
rootCmd.MarkFlagRequired("name")
上次修改: 18 March 2020