Go开发命令行程序指南( 三 )

  • “-o”是另一个标志,用于指定输出文件的名称
  • “output.txt”则是一个参数,是为“-o”标志提供的值 。
  • **参数(argument)**是不以中划线(-)开头的输入参数,为你的CLI程序提供额外的信息或数据 。例如:
    $tar xvf archive.tar.gz我们看在这个例子中:
    • x是一个指定提取模式的参数
    • v是一个参数,指定的是输出内容的详细(verbose)程度
    • f是另一个参数,用于指定采用的是文件模式,即将压缩结果输出到一个文件或从一个压缩文件读取数据
    • archive.tar.gz是一个参数,提供文件名 。
    **子命令(subcommand)**是输入参数,作为主命令下的辅助命令 。它们通常有自己的一组标志和参数 。比如下面例子:
    $git commit -m "Initial commit"我们看在这个例子中:
    • git是主命令(primary command)
    • commit是一个子命令,用于从staged的修改中创建一个新的提交(commit)
    • “-m”是commit子命令的一个标志,用于指定提交信息
    • "Initial commit"是commit子命令的一个参数,为"-m"标志提供值 。
    **选项(option)**是输入参数,它可以使用等号(=)将标志和参数合并为一个参数 。例如:
    $docker run --name=my-container ubuntu:latest我们看在这个例子中“--name=my-container”是一个选项,它将容器的名称设为my-container 。该选项前面的部分“--name”是一个标志,后面的部分“my-container”是参数 。
    3. 使用cobra包等来解析和验证用户输入的信息如果手工来解析和验证用户输入的信息,既繁琐又容易出错 。幸运的是,有许多库和框架可以帮助你在Go中解析和验证用户输入 。其中最流行的是cobra[16] 。
    cobra是一个Go包,它提供了简单的接口来创建强大的CLI程序 。它支持子命令、标志、参数、选项、环境变量和配置文件 。它还能很好地与其他库集成,比如:viper[17](用于配置管理)、pflag[18](用于POSIX/GNU风格的标志)和Docopt[19](用于生成文档) 。
    另一个不那么流行但却提供了一种声明式的方法来创建优雅的CLI程序的包是Kingpin[20],它支持标志、参数、选项、环境变量和配置文件 。它还具有自动帮助生成、命令完成、错误处理和类型转换等功能 。
    cobra和Kingpin在其官方网站上都有大量的文档和例子,你可以根据你的偏好和需要选择任选其一 。
    4. 遵循POSIX惯例和GNU扩展的CLI语法POSIX(Portable Operating System Interface)[21]是一套标准,定义了软件应该如何与操作系统进行交互 。其中一个标准定义了CLI程序的语法和语义 。GNU(GNU's Not Unix)是一个旨在创建一个与UNIX兼容的自由软件操作系统的项目 。GNU下的一个子项目是GNU Coreutils[22],它提供了许多常见的CLI程序,如ls、cp、mv等 。
    POSIX和GNU都为CLI语法建立了一些约定和扩展,许多CLI程序都采用了这些约定与扩展 。下面列举了这些约定和扩展中的一些主要内容:
    • 单字母标志(single-letter flag)以一个中划线(-)开始,可以组合在一起(例如:-a -b -c 或 -abc )
    • 长标志(long flag)以两个中划线(--)开头,但不能组合在一起(例如:--all、--backup、--color )
    • 选项使用等号(=)来分隔标志名和参数值(例如:--name=my-container )
    • 参数跟在标志或选项之后,没有任何分隔符(例如:curl -o output.txt https://example.com ) 。
    • 子命令跟在主命令之后,没有任何分隔符(例如:git commit -m "Initial commit" )
    • 一个双中划线(--)表示标志或选项的结束和参数的开始(例如:rm -- -f 表示要删除“-f”这个文件,由于双破折线的存在,这里的“-f”不再是标志)
    遵循这些约定和扩展可以使你的CLI程序更加一致、直观,并与其他CLI程序兼容 。然而,它们并不是强制性的,如果你有充分的理由,你也大可不必完全遵守它们 。例如,一些CLI程序使用斜线(/)而不是中划线(-)表示标志(例如,robocopy /S /E src dst ) 。


    推荐阅读