创建一个杀手级 Go Cli 的 5 个关键点

本文翻译自 https://blog.alexellis.io/5-keys-to-a-killer-go-cli/。 本文的作者是 OpenFaaS 的作者,原文中作者结合了自身开发 OpenFaaS 经历说明的 CLI 应该需要的注意事项,翻译过程中为了方便理解很多已经略去,但是不妨碍整体理解作者表达使用 Go 创建优秀 CLI 的意图以及方法。

CLI(命令行接口)是一种文本接口,其提供了一种快速、自动化的方式与应用程序打交道,并且还可以和其他命令行程序接口创建新的工作流。

选择 Go 创建 CLI

选择 Go 创建 CLI 的优势 Compiles to a single static binary — 能够编译成单独的二进制包 Go 可以非常方便的根据平台打包成二进制包发布,根据平台的不同,只需要在编译的时候提供不同的环境变量即可:

1GOOS=windows go build -o cli.exe 
2GOOS=linux go build -o cli 
3GOARCH=armv7 GOOS=linux go build -o cli-rpi

Consistent style — 一致的风格 无论你的项目是基于何种编辑器,Go 总是提供一致的代码风格,这点和 Nodejs 不同,后者总是包含很多种不同的 “task runners” 让人眼花缭乱。 Go 在风格保持方面的设计可以说非常不含糊,这样的设计有利于开发者进行协作。 Fast on every platform — 在任何平台都很快 编译后 Go 二进制包加载非常快相比 Nodejs 来说。 Easy to create a REST client — 创建 REST 风格的 client 非常容易 Go 提供了非常丰富的 http client,并且内置了对 xml、json 的支持,社区的第三方库也提供了对 YAML 的支持

Parse flags & argumentsGo

标准库提供了 flags 包来创建 CLI 应用程序:

 1package main
 2import (
 3    "flag"
 4    "fmt"
 5    "os"
 6)
 7func main() {
 8    var image string
 9    flag.StringVar(&image, "image", "", "Docker image")
10    flag.Parse()
11    if len(image) == 0 {
12        fmt.Fprintf(os.Stderr, "You must specify a Docker image name")
13    }
14    fmt.Printf("Your Docker image was: %s", image)
15}
Go 的简单朴可以让你仅仅使用一个文件就能够编译成要执行的二进制包。

如果你觉得 flags 包提供的特性已经无法满足你的 CLI ,你可以考虑使用 Cobra 。 Cobra 被 Docker、Kubernetes 等知名开源软件使用,Cobra 也可以让创建 CLI 的文档变得非常简单。除此之外,Cobra 支持动词名词的语法,这有助于提升 CLI 的用户体验:

1 faas-cli -deploy -image=functions/alpine -name=cat -fprocess=/bin/cat

To:

1 faas-cli deploy --image=functions/alpine --name=cat --fprocess=/bin/cat

自动化一切

使用一个免费公开的 CI 平台来自动化 build 工作,比如 Travis,这样可以让 contributors 检测他们的贡献是否可以被集成。

使用 Github release 来跟踪项目的变化和里程碑,可以在 Travis 中创建一个 post-build action 来自动打包发布各个平台的应用。

如果你使用 Docker ,每当要发布新的 release 同时也发布对应的 Docker 镜像。

集成包管理器

如果你想要你的受众非常容易使用你的 CLI,最好让你的 CLI 支持使用包管理器安装:

  • Mac 大多数开发者的环境都是 Mac,所以提供 brew 的支持是个明智的选择
  • Linux 对于 Linux 可以提供命令行安装和使用的方案,比如 curl -sL https://cli.openfaas.com | sh
  • Windows 大多数 Windows 用户倾向于使用安装的方式,Windows 平台的好用的 shell 工具在不断增多,也可以考虑提供一种 shell 的安装方式

无论是支持哪个平台的包管理,优先确保你的工作是可自动化的,而且升级能够平滑进行。

接受社区的贡献和收集反馈

为用户提供一种非常方便的反馈方式。基础的反馈和统计可以通过 Github 或者 brew 来完成。有些关键性的项目是可以通过第三方工具收集反馈,比如通过 brew、Visual Studio Code 等:

  • 哪个命令被使用
  • OS、CLI version、location 等等

2018年5月24日社区内部分享,晚上21:00 ,Go协程调度讲解 YY频道:15288615 时 间:2018年5月24日 晚上21:00

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2018-05-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 开发者

[译] Android 的多摄像头支持

从 Android P 开始,添加了对逻辑多摄像头和 USB 摄像头的支持。这对 Android 开发者来说意味着什么?

3874
来自专栏小勇DW3

【转载】java架构师进阶之路

Java架构师,应该算是一些Java程序员们的一个职业目标了吧。很多码农码了五六年的代码也没能成为架构师。那成为Java架构师要掌握哪些技术呢,总体来说呢,有两...

8303
来自专栏恒思考

像Django学习写程序

Django是一个python的web的快速开发框架,Django也是我接触的第一个web框架。这个框架是一个比较重的框架,有些人对这件事情比较诟病,但是开发起...

2005
来自专栏AzMark

墙裂推荐 Anaconda | 安利 Python IDE

由于 Python 有 2 和 3 两个版本,因此 Anaconda 也在 Python2 和 Python3 的基础上推出了两个发行版,即Anaconda2 ...

2603
来自专栏北京马哥教育

程序员技术练级攻略

月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programm...

36211
来自专栏SDNLAB

OpenDaylight发布氧版本(Oxygen):不断提高的成熟度和生产稳定性

4317
来自专栏沈唁志

详解Linux运维工程师必备技能

2932
来自专栏前端大白专栏

关于react-native的各种报错的最终解决方案

2519
来自专栏CSDN技术头条

大规模数据集成: Linked Data

在本系列的前两篇文章(“ 使用 RDF 创建数据网络 ” 和 “ 使用 SPARQL 查询 RDF 数据 ”)中,您了解了资源描述框架和 SPARQL 协议和 ...

2338
来自专栏PPV课数据科学社区

编程 | 用python获取天气数据,并作定时播报

思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早上定时播报天气(定时任务crontab + Pytho...

6868

扫码关注云+社区

领取腾讯云代金券