go语言建造者模式 go语言建造者模式是什么( 二 )


kubectl 命令更能体现APPNAME 动词 名词 形容词
如下的例子 , server 是command,port是flag
这个命令中,我们告诉git 克隆url
命令是应用程序的中心点,应用程序支持的每一个交互都包含在一个命令中 , 命令可以有子命令,也可以运行操作
在上面的例子中,server是命令
更多关于cobra.Command
flag是一种修改命令行为的方式,cobra支持完全兼容POSIX标志,也支持go flag package,cobra可以定义到子命令上的标志,也可以仅对该命令可用的标志
在上面的命令中,port是标志
标志的功能由 pflag library 提供,pflag library是flag标准库的一个分支,在添加POSIX兼容性的同时维护相同的接口 。
使用cobra很简单,首先,使用go get按照最新版本的库,这个命令会安装cobra可执行程序以及库和依赖项
下一步,引入cobra到应用程序中
虽然欢迎您提供自己的组织,但通常基于Cobra的应用程序将遵循以下组织结构:
在Cobra应用程序中,main.go文件通常非常简单 。它有一个目的:初始化Cobra 。
使用cobra生成器
cobra提供了程序用来创建你的应用程序然后添加你想添加的命令,这是将cobra引入应用程序最简单的方式
这儿 你可以发现关于cobra的更多信息
要手动实现cobra,需要创建一个main.go 和rootCmd文件,可以根据需要提供其他命令
Cobra不需要任何特殊的构造器 。只需创建命令 。
理想情况下 , 您可以将其放在app/cmd/root.go中:
在init()函数中定义标志和处理配置
例子如下,cmd/root.go:
创建main.go
使用root命令 , 您需要让主函数执行它 。为清楚起见,Execute应该在根目录下运行,尽管它可以在任何命令上调用 。
在Cobra应用程序中 , main.go文件通常非常简单 。它有一个目的:初始化Cobra 。
可以定义其他命令,通常每个命令在cmd/目录中都有自己的文件 。
如果要创建版本命令 , 可以创建cmd/version.go并用以下内容填充它:
如果希望将错误返回给命令的调用者,可以使用RunE 。
然后可以在execute函数调用中捕获错误 。
标志提供修饰符来控制操作命令的操作方式 。
由于标志是在不同的位置定义和使用的 , 因此我们需要在外部定义一个具有正确作用域的变量来分配要使用的标志 。
有两种不同的方法来分配标志 。
标志可以是“持久”的,这意味着该标志将可用于分配给它的命令以及该命令下的每个命令 。对于全局标志,在根上指定一个标志作为持久标志 。
也可以在本地分配一个标志,该标志只应用于该特定命令 。
默认情况下,Cobra只解析目标命令上的本地标志,而忽略父命令上的任何本地标志 。通过启用Command.TraverseChildren,Cobra将在执行目标命令之前解析每个命令上的本地标志 。
使用viper绑定标志
在本例中,持久标志author与viper绑定 。注意:当用户未提供--author标志时,变量author将不会设置为config中的值 。
更多关于 viper的文档
Flags默认是可选的,如果希望命令在未设置标志时报告错误,请根据需要进行标记:
持久性Flags
可以使用命令的Args字段指定位置参数的验证 。
内置了以下验证器:
在下面的示例中,我们定义了三个命令 。两个是顶级命令 , 一个(cmdTimes)是顶级命令之一的子命令 。在这种情况下,根是不可执行的,这意味着需要一个子命令 。这是通过不为“rootCmd”提供“Run”来实现的 。
我们只为一个命令定义了一个标志 。

推荐阅读