Go开发命令行程序指南

近期在Twitter上看到一个名为“Command Line Interface Guidelines”的站点[1],这个站点汇聚了帮助大家编写出更好命令行程序的哲学与指南 。这份指南基于传统的Unix编程原则[2],又结合现代的情况进行了“与时俱进”的更新 。之前我还真未就如何编写命令行交互程序做系统的梳理,在这篇文章中,我们就来结合clig这份指南[3],(可能不会全面覆盖)整理出一份使用Go语言编写CLI程序的指南,供大家参考 。
一. 命令行程序简介命令行接口(Command Line Interface, 简称CLI)程序是一种允许用户使用文本命令和参数与计算机系统互动的软件 。开发人员编写CLI程序通常用在自动化脚本、数据处理、系统管理和其他需要低级控制和灵活性的任务上 。命令行程序也是linux/Unix管理员以及后端开发人员的最爱 。
2022年Q2 Go官方用户调查结果[4]显示(如下图):在使用Go开发的程序类别上,CLI类程序排行第二,得票率60% 。

Go开发命令行程序指南

文章插图
之所以这样,得益于Go语言为CLI开发提供的诸多便利,比如:
  • Go语法简单而富有表现力;
  • Go拥有一个强大的标准库,并内置的并发支持;
  • Go拥有几乎最好的跨平台兼容性和快速的编译速度;
  • Go还有一个丰富的第三方软件包和工具的生态系统 。
这些都让开发者使用Go创建强大和用户友好的CLI程序变得容易 。
容易归容易,但要用Go编写出优秀的CLI程序,我们还需要遵循一些原则,获得一些关于Go CLI程序开发的最佳实践和惯例 。这些原则和惯例涉及交互界面设计、错误处理、文档、测试和发布等主题 。此外,借助于一些流行的Go CLI程序开发库和框架,比如:cobra[5]、Kingpin[6]和Goreleaser[7]等,我们可以又好又快地完成CLI程序的开发 。在本文结束时,你将学会如何创建一个易于使用、可靠和可维护的Go CLI程序,你还将获得一些关于CLI开发的最佳实践和惯例的见解 。
二. 建立Go开发环境如果你读过《十分钟入门Go语言》[8]或订阅学习过我的极客时间《Go语言第一课》专栏[9],你大可忽略这一节的内容 。
在我们开始编写Go CLI程序之前,我们需要确保我们的系统中已经安装和配置了必要的Go工具和依赖 。在本节中,我们将向你展示如何安装Go和设置你的工作空间,如何使用go mod进行依赖管理[10],以及如何使用go build和go install来编译和安装你的程序 。
1. 安装Go要在你的系统上安装Go,你可以遵循你所用操作系统的官方安装说明 。你也可以使用软件包管理器,如homebrew[11](用于macOS)、chocolatey(用于windows)或snap/apt(用于Linux)来更容易地安装Go 。
一旦你安装了Go,你可以通过在终端运行以下命令来验证它是否可以正常工作 。
$go version如果安装成功,go version这个命令应该会打印出你所安装的Go的版本 。比如说:
go version go1.20 darwin/amd642. 设置你的工作区(workspace)Go以前有一个惯例,即在工作区目录中(组织你的代码和依赖关系 。默认工作空间目录位于HOME/go,但你可以通过设置GOPATH环境变量来改变它的路径 。工作区目录包含三个子目录:src、pkg和bin 。src目录包含了你的源代码文件和目录 。pkg目录包含被你的代码导入的已编译好的包 。bin目录包含由你的代码生成的可执行二进制文件 。
Go 1.11引入Go module[12]后,这种在下组织代码和寻找依赖关系的要求被彻底取消 。在这篇文章中,我依旧按照我的习惯在HOME/go/src下放置我的代码示例 。
为了给我们的CLI程序创建一个新的项目目录,我们可以在终端运行以下命令:
$mkdir -p $HOME/go/src/Github.com/your-username/your-li-program$cd $HOME/go/src/github.com/your-username/your-cli-program注意,我们的项目目录名使用的是github的URL格式 。这在Go项目中是一种常见的做法,因为它使得使用go get导入和管理依赖关系更加容易 。go module成为构建标准后,这种对项目目录名的要求已经取消,但很多Gopher依旧保留了这种作法 。
3. 使用go mod进行依赖管理1.11版本后Go推荐开发者使用module来管理包的依赖关系 。一个module是共享一个共同版本号和导入路径前缀的相关包的集合 。一个module是由一个叫做go.mod的文件定义的,它指定了模块的名称、版本和依赖关系 。
为了给我们的CLI程序创建一个新的module,我们可以在我们的项目目录下运行以下命令 。


推荐阅读