概述
CLI 开发人员更喜欢 Go,因为它具有可移植性、性能和易于创建的特点
命令行界面 (CLI) 不同于图形用户界面 (GUI),它仅限于文本。云和基础设施应用程序主要基于 CLI,因为它们易于自动化和具有远程功能。
主要优点
利用快速的编译时间来构建可在任何系统上快速启动和运行的程序
CLI 开发人员发现 Go 非常适合设计其应用程序。Go 可以非常快速地编译成单个二进制文件,在各个平台上以一致的风格运行,并带来强大的开发社区。开发人员只需使用一台 Windows 或 Mac 笔记本电脑,即可在几秒钟内为 Go 支持的数十种架构和操作系统构建一个 Go 程序,而无需复杂的构建场。没有其他编译语言可以如此便携或快速地构建。Go 应用程序构建为一个独立的二进制文件,从而使 Go 应用程序的安装变得非常简单。
具体来说,用 Go 编写的程序可以在任何系统上运行,而无需任何现有的库、运行时或依赖项。而且用 Go 编写的程序具有即时启动时间——类似于 C 或 C++,但其他编程语言无法实现。
用例
使用 Go 构建优雅的 CLI
在 Go 中开发 CLI 时,广泛使用了两个工具:Cobra 和 Viper。
Cobra 既是一个用于创建强大的现代 CLI 应用程序的库,也是一个用于在 Go 中生成应用程序和 CLI 应用程序的程序。Cobra 为大多数流行的 Go 应用程序提供支持,包括 CoreOS、Delve、Docker、Dropbox、Git Lfs、Hugo、Kubernetes 和 更多。OpenFaaS 的创始人 Alex Ellis 说:“通过集成的命令帮助、自动完成和文档,[它] 使得记录每个命令变得非常简单。”
Viper 是 Go 应用程序的完整配置解决方案,旨在在应用程序内工作以处理配置需求和格式。Cobra 和 Viper 被设计为可以协同工作。
Viper 支持嵌套结构,允许 CLI 开发人员管理大型应用程序的多个部分的配置。Viper 还提供了轻松构建十二因子应用程序所需的所有工具。
“如果你不想污染你的命令行,或者如果你正在处理敏感数据,而你不想在历史记录中显示这些数据,那么最好使用环境变量。为此,你可以使用 Viper,”Geudens 建议。
特色用户
客户 | 简介 | 使用 Go 的项目 |
---|---|---|
Comcast 使用 Go 为 CLI 客户端发布和订阅其高流量网站。该公司还支持一个用 Go 编写的开源客户端库,该库旨在与 Apache Pulsar 协同工作。 | ||
GitHub 使用 Go 为命令行工具,使其更容易使用 GitHub,包装 git 以扩展其功能和命令。 | ||
Hugo 是最流行的 Go CLI 应用程序之一,为包括本网站在内的数千个网站提供支持。它受欢迎的一个原因是它易于安装,这要归功于 Go。Hugo 作者 Bjørn Erik Pedersen 写道:“单个二进制文件消除了安装和升级的大部分麻烦。” | ||
Kubernetes 是最流行的 Go CLI 应用程序之一。Kubernetes 创建者 Joe Beda 说,对于编写 Kubernetes,“Go 是唯一合乎逻辑的选择”。称 Go 为 C++ 等低级语言和 Python 等高级语言之间的“最佳选择”。 | ||
MongoDB 选择在 Go 中实现其备份 CLI 工具,理由是 Go 的“类似 C 的语法、强大的标准库、通过 goroutine 解决并发问题以及无痛的多平台分发”。 | ||
Netflix 使用 Go 构建 CLI 应用程序 ChaosMonkey,该应用程序负责在生产中随机终止实例,以确保工程师实施其服务以应对实例故障。 | ||
Stripe 使用 Go 构建 Stripe CLI,旨在直接从终端构建、测试和管理 Stripe 集成。 | ||
Uber 将 Go 用于多个 CLI 工具,包括 Jaeger 的 CLI API,Jaeger 是一个用于监控微服务分布式系统的分布式跟踪系统。 |
开始使用
用于创建 CLI 的 Go 书籍
CLI 库
-
spf13/cobra
用于创建强大的现代 CLI 应用程序的库,以及用于在 Go 中生成应用程序和 CLI 应用程序的程序
-
spf13/viper
Go 应用程序的完整配置解决方案,旨在应用内工作以处理配置需求和格式
-
urfave/cli
用于创建和组织命令行 Go 应用程序的最小框架
-
delve
为习惯于在编译语言中使用源代码级调试器的程序员构建的简单而强大的工具
-
chzyer/readline
提供 GNU Readline(在 MIT 许可证下)中大多数功能的纯 Golang 实现
-
dixonwille/wmenu
CLI 应用程序中易于使用的菜单结构,提示用户做出选择
-
spf13/pflag
Go 的 flag 包的替代品,实现 POSIX/GNU 样式标志
-
golang/glog
Go 的分级执行日志
-
go-prompt
用于构建强大的交互式提示的库,使用 Go 构建跨平台命令行工具变得更加容易。