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


$go mod init github.com/your-username/your-cli-program这将创建一个名为go.mod的文件,内容如下 。
module github.com/your-username/your-cli-programgo 1.20第一行指定了我们的module名称,这与我们的项目目录名称相匹配 。第二行指定了构建我们的module所需的Go的最低版本 。
为了给我们的模块添加依赖项,我们可以使用go get命令,加上我们想使用的软件包的导入路径和可选的版本标签 。例如,如果我们想使用cobra[13]作为我们的CLI框架,我们可以运行如下命令:
$go get github.com/spf13/cobra@v1.3.0go get将从github下载cobra,并在我们的go.mod文件中把它作为一个依赖项添加进去 。它还将创建或更新一个名为go.sum的文件,记录所有下载的module的校验和,以供后续验证使用 。
我们还可以使用其他命令,如go list、go mod tidy、go mod graph等,以更方便地检查和管理我们的依赖关系 。
4. 使用go build和go install来编译和安装你的程序Go有两个命令允许你编译和安装你的程序:go build和go install 。这两个命令都以一个或多个包名或导入路径作为参数,并从中产生可执行的二进制文件 。
它们之间的主要区别在于它们将生成的二进制文件存储在哪里 。

  • go build将它们存储在当前工作目录中 。
  • go install将它们存储在或GOBIN(如果设置了) 。
例如,如果我们想把CLI程序的main包(应该位于github.com/your-username/your-cli-program/cmd/your-cli-program)编译成一个可执行的二进制文件,称为your-cli-program,我们可以运行下面命令:
$go build github.com/your-username/your-cli-program/cmd/your-cli-program
$go install github.com/your-username/your-cli-program/cmd/your-cli-program@latest三. 设计用户接口(interface)要编写出一个好的CLI程序,最重要的环节之一是**设计一个用户友好的接口[14] 。好的命令行用户接口应该是一致的、直观的和富有表现力的** 。在本节中,我将说明如何为命令行程序命名和选择命令结构(command structure),如何使用标志(flag)、参数(argument)、子命令(subcommand)和选项(option)作为输入参数,如何使用cobra或Kingpin等来解析和验证用户输入,以及如何遵循POSIX惯例和GNU扩展的CLI语法 。
1. 命令行程序命名和命令结构选择你的CLI程序的名字应该是**简短、易记、描述性的和易输入的[15]** 。它应该避免与目标平台中现有的命令或关键字发生冲突 。例如,如果你正在编写一个在不同格式之间转换图像的程序,你可以把它命名为imgconv、imago、picto等,但不能叫image、convert或format 。
你的CLI程序的命令结构应该反映你想提供给用户的主要功能特性 。你可以选择使用下面命令结构模式中的一种:
  • 一个带有多个标志(flag)和参数(argument)的单一命令(例如:curl、tar、grep等)
  • 带有多个子命令(subcommand)的单一命令(例如:git、Docker、kubectl等)
  • 具有共同前缀的多个命令(例如:aws s3、gcloud compute、az vm等)
命令结构模式的选择取决于你的程序的复杂性和使用范围,一般来说:
  • 如果你的程序只有一个主要功能或操作模式(operation mode),你可以使用带有多个标志和参数的单一命令 。
  • 如果你的程序有多个相关但又不同的功能或操作模式,你可以使用一个带有多个子命令的单一命令 。
  • 如果你的程序有多个不相关或独立的功能或操作模式,你可以使用具有共同前缀的多个命令 。
例如,如果你正在编写一个对文件进行各种操作的程序(如复制、移动、删除),你可以任选下面命令结构模式中的一种:
  • 带有多个标志和参数的单一命令(例如,fileop -c src dst -m src dst -d src)
  • 带有多个子命令的单个命令(例如,fileop copy src dst, fileop move src dst, fileop delete src)
2. 使用标志、参数、子命令和选项**标志(flag)**是以一个或多个(通常是2个)中划线(-)开头的输入参数,它可以修改CLI程序的行为或输出 。例如:
$curl -s -o output.txt https://example.com在这个例子中: