Go命令行工具cobra
关于
Cobra 是 Go 的 CLI 框架。它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。
Cobra 由 Go 项目成员和 hugo 作者 spf13 创建,已经被许多流行的 Go 项目采用,比如 kubernetes、docker等
特性
- 简单的基于子命令的 CLIs:
app server
、app fetch
等; - 完全兼容 POSIX(可移植操作系统接口) 的标志(包括短版和长版)
- 嵌套子命令
- 全局、局部和级联的标志
- 使用
cobra init appname
和cobra add cmdname
轻松生成应用程序和命令 - 智能提示(
app srver
...did you meanapp server
) - 自动生成命令和标志的帮助
- 自动识别
-h
、--help
等帮助标识 - 自动为你的应用程序生成的 bash 自动完成
- 自动为你的应用程序生成 man 手册
- 命令别名,以便你可以更改内容而不会破坏它们
- 定义自己的帮助,用法等的灵活性。
- 可选与 viper 紧密集成,可用于 12factor 应用程序
概念
Cobra 构建在命令(commands)、参数(arguments)和 标志(flags)上。
Commands 代表动作,Args 是事物,Flags 是这些动作的修饰符。
最好的应用程序在使用时会像句子一样读起来。用户将知道如何使用该应用程序,因为他们将自然地了解如何使用它。
遵循的模式是 APPNAME VERB NOUN --ADJECTIVE
。 或 APPNAME COMMAND ARG --FLAG
一些真实的例子可以更好地说明这一点。
在以下示例中,server
是命令,port
是标志:
hugo server --port=1313
在此命令中,我们告诉 Git 克隆 url 的内容:
git clone URL --bare
命令(Command)
命令是应用程序的核心。应用程序提供的每一个交互都包含在 Command 中。一个命令可以有子命令和可选的运行一个动作。
在上面的示例中,server
是命令。
标志(Flags)
一个标志是一种修饰命令行为的方式。Cobra 支持完全符合 [https://zh.wikipedia.org/wiki/可移植操作系统接口) 包。
Cobra 命令可以定义一直保留到子命令的标志和仅可用于该命令的标志。
在上面的例子中,port
是标志。
标志的功能是 pflag 库提供的,该库是一个标准库的 fork,在维护相同接口的基础上兼容了 POSIX(可移植操作系统接口)。
简单使用
// 目录结构
├── add
│ └── add.go
├── go.mod
├── go.sum
└── main.go
// main.go
package main
import (
"log"
"test/add"
"github.com/spf13/cobra"
)
var rootCmd = &cobra.Command{
Use: "test",
Short: "测试",
Long: `我要写博客做个测试呢,这是个常提示`,
Version: "v1.1",
}
func init() {
rootCmd.AddCommand(add.CmdAdd)
}
func main() {
if err := rootCmd.Execute(); err != nil {
log.Fatal(err)
}
}
// add/add.go
package add
import (
"fmt"
"github.com/spf13/cobra"
)
var CmdAdd = &cobra.Command{
Use: "add",
Short: "新键",
Long: "新建个文件",
RunE: RunE,
}
var path string
func init() {
CmdAdd.Flags().StringVarP(&path, "path", "p", path, "file path")
}
func RunE(cmd *cobra.Command, args []string) error {
fmt.Println("假装创建个文件 path=", path)
return nil
}
执行结果
# go run main.go --help
我要写博客做个测试呢,这是个常提示
Usage:
test [command]
Available Commands:
add 新键
completion Generate the autocompletion script for the specified shell
help Help about any command
Flags:
-h, --help help for test
-v, --version version for test
Use "test [command] --help" for more information about a command.
# go run main.go add --help
新建个文件
Usage:
test add [flags]
Flags:
-h, --help help for add
-p, --path string file path
# go run main.go add --path=/user/pass
假装创建个文件 path= /user/pass
# go run main.go --version
test version v1.1
Command参数
例子中的cobra.Command
是个结构体,有很多字段,都是做什么用的呢?
这些参数是Go语言中cobra
库中的Command
结构体的字段,用于定义命令行工具的行为和选项。它们的作用如下:
Use
: 命令名称。Aliases
: 命令的别名。SuggestFor
: 命令建议使用的单词列表。Short
: 命令简短描述。GroupID
: 命令所属的命令组。Long
: 命令详细描述。Example
: 命令的使用示例。ValidArgs
: 命令接受的参数列表。ValidArgsFunction
: 命令用于提供动态参数补全的函数。Args
: 命令的位置参数列表。ArgAliases
: 位置参数的别名。BashCompletionFunction
: 生成Bash补全的函数。Deprecated
: 命令是否已经过时的标志。Annotations
: 命令的附加注释信息。Version
: 命令版本号。PersistentPreRun
: 每次执行该命令之前都会执行的函数。PersistentPreRunE
: 每次执行该命令之前都会执行的返回错误的函数。PreRun
: 每次执行该命令之前都会执行的函数。PreRunE
: 每次执行该命令之前都会执行的返回错误的函数。Run
: 执行命令的函数。RunE
: 执行命令的返回错误的函数。PostRun
: 每次执行该命令之后都会执行的函数。PostRunE
: 每次执行该命令之后都会执行的返回错误的函数。PersistentPostRun
: 每次执行该命令之后都会执行的函数。PersistentPostRunE
: 每次执行该命令之后都会执行的返回错误的函数。FParseErrWhitelist
: 忽略特定的解析错误CompletionOptions
:控制 shell 自动完成的选项TraverseChildren
: 解析父命令的标志后再执行子命令Hidden
: 隐藏命令,不在可用命令列表中显示SilenceErrors
: 静默下游错误SilenceUsage
: 静默错误时不显示用法DisableFlagParsing
: 禁用标志解析DisableAutoGenTag
: 禁用自动生成的标记DisableFlagsInUseLine
: 在打印帮助或生成文档时禁用“[flags]”在用法行中的添加DisableSuggestions
: 禁用基于Levenshtein距离的建议SuggestionsMinimumDistance
: 显示建议的最小Levenshtein距离
Reference
Go命令行工具cobra的更多相关文章
- go Cobra命令行工具入门
简介 Github:https://github.com/spf13/cobra Star:26.5K Cobra是一个用Go语言实现的命令行工具.并且现在正在被很多项目使用,例如:Kuberne ...
- windows下的命令行工具babun
什么是babun babun是windows上的一个第三方shell,在这个shell上面你可以使用几乎所有linux,unix上面的命令,他几乎可以取代windows的shell.用官方的题目说就是 ...
- 『.NET Core CLI工具文档』(一).NET Core 命令行工具(CLI)
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Command Line Tools 翻译:.NET Core命令行工具 什么是 .NET Core ...
- 命令行工具aspnet_regiis.exe实现加密和解密web.config
命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...
- nodejs 编写(添加时间戳)命令行工具 timestamp
Nodejs除了编写服务器端程序还可以编写命令行工具,如gulp.js就是Nodejs编写的. 接下来我们来实现一个添加时间戳的命令: $ timestamp action https://www.n ...
- 如何用Node编写命令行工具
0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...
- Orchard中的命令行工具
在Orchard中提供了一个命令行工具,我们可以使用这个命令行工具创建用户.创建博客.生成代码.配置网站.打包模块等.并且这个命令行工具是可以扩充的,只要我们在自己开发的模块中创建一个Command类 ...
- Linux 性能监控之命令行工具
引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因.这个命令行工具列表提供了足够的 ...
- 命令行工具解析Crash文件,dSYM文件进行符号化
备份 文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...
- MySQL 命令行工具之 mysqldump 深入研究
mysqldump 是MySQL的一个命令行工具,用于逻辑备份.可以将数据库和表的结构,以及表中的数据分别导出成:create database, create table, insert into的 ...
随机推荐
- git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决
git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决 当多人写一个项目,最好还是关掉vscode ...
- 快速搭建Web安全测试环境
快速搭建Web安全测试环境 1.虚拟机安装 2.网站搭建 一.虚拟机安装 下载VMware虚拟机,Windows 虚拟机 | Workstation Pro | VMware | CN 安装VMwar ...
- 逆向通达信Level-2 续八 (BackTrace, Trace任意TdxW.exe内部函数, Breakin)
TdxW kun anti-debugging, i debug you without a debugger. 添加bt命令,BackTrace 下图是hack某一个函数后使用bt命令进行Trace ...
- jenkins安装和基本使用
参考:https://zhuanlan.zhihu.com/p/56037782(安装) https://gitee.com/oschina/Gitee-Jenkins-Plugin/(使用) htt ...
- [模板]01trie,维护异或最大值
// 查询异或最大值,每次插入和查询时间都是log(C) template<class T> class trie01 { vector<vector<T>> tr ...
- 3DCAT为3D应用在云端构筑一个可靠的家
保护知识产权,一直是数字化长期关注的议题,如何保护应用内的数字化资产(文字.图片.音频.视频.模型)等,是当今行业的难题,只要运行在Windows环境的三维应用,都可能面临被破解提取出资产,为原创版权 ...
- 专访冠军考拉ok|“新人问我学Blender能找到工作吗,我回复不能”
"新锐先锋,玩转未来"--首届实时染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视典 ...
- Smtp Oauth With Python
我的博客园:https://www.cnblogs.com/CQman/ GitHub #基于Python语言的smtp Oauth 连接世纪互联运营的Office 365(或21V O365)的邮箱 ...
- 恶意软件开发(一)Reverse Shell
什么是Reverse Shell? 反向 Shell(Reverse Shell)是指远程攻击者在攻击成功后,通过建立一个反向连接,让受害者的机器连接到攻击者的机器上,从而达到控制受害者机器的目的.通 ...
- KingbaseESV8R6表空间与数据库,模式,表的关系
自定义表空间的作用 使用多个表空间可以更灵活地执行数据库操作.当数据库具有多个表空间时,您可以: 1.将用户数据与系统表数据分开存储在不同性能的存储上,以减少I/O争用. 2.将一个应用程序的数据与另 ...