东昌府区建设局网站,小程序商城怎么弄,注册科技有限公司可以做网站吗,伊宁网站建设优化Cobra 是 golang 最流行的命令行库#xff0c;文档见
一、脚手架
mkdir pt cd pt go mod init
cobra-cli init # 在项目下运行即可生成脚手架# tree
.
├── LICENSE
├── cmd # 生成了cmd目录
│ └── root.go # 生成了root.go, 其中定义了ro… Cobra 是 golang 最流行的命令行库文档见
一、脚手架
mkdir pt cd pt go mod init
cobra-cli init # 在项目下运行即可生成脚手架# tree
.
├── LICENSE
├── cmd # 生成了cmd目录
│ └── root.go # 生成了root.go, 其中定义了rootCmt变量
├── go.mod
├── go.sum
└── main.go# go run main.go
Usage:pt [command]Available Commands:completion Generate the autocompletion script for the specified shellhelp Help about any commandshow Display current timeFlags:-h, --help help for pt-t, --toggle Help message for toggle二、子命令
# cobra-cli add show # 添加名为show的子命令, 则会自动生成cmd/show.go代码# go run main.go show # 执行名为show的子命令
2023-08-28 22:00:58.263991 0800 CST m0.000923251# go run main.go show -h # 获取名为show的子命令的帮助信息
will display like 2023-08-28 22:00:58.263991 0800 CST m0.000923251Usage:pt show [flags]Flags:-h, --help help for show三、flag 参数
3.1 定义
// 添加参数
func init() {rootCmd.AddCommand(proto2jsonCmd)proto2jsonCmd.Flags().StringP(content, c, , byte content of a.proto)proto2jsonCmd.Flags().StringP(filepath, f, , filepath of proto file)
}// 输出如下:
with a.proto protocolUsage:pt p2j [flags]Flags:-c, --content string byte content of a.proto-f, --filepath string filepath of proto file-h, --help help for p2j3.2 使用
如果需要使用 全局flag 或者 局部flag需要在合适的作用域内定义变量存储 flag 值以便 flag 可在特定作用域内生效。
3.2.1 使用全局flag
让一个 flag 对所有命令生效需要在 root.go 文件中创建一个变量存储 flag 值。
如需要定义一个全局flag name
// 在root.go 文件中添加一个变量name
var name string// 在init函数中添加全局flag将flag值存储到变量name中
rootCmd.PersistentFlags().StringVar(name, name, , set name)// 在子命令version的Run方法中输出name
Run: func(cmd *cobra.Command, args []string) { fmt.Println(name is: , name)
}// 执行命令
./demo version --name a
输出
name is: a3.2 使用局部 flag
让一个 flag 对某个命令生效需要在该命令文件中创建一个变量存储 flag 值。
如需要给version命令定义一个局部flag name
// 定义变量content
var content string// 在version.go的init函数中添加flag
versionCmd.Flags().StringVarP(content, content, s, false, you are my sunshine)// 在子命令version.go的Run方法中输出
Run: func(cmd *cobra.Command, args []string) { fmt.Println(name is: , name)fmt.Println(content is: , content)
}// 执行命令
./demo version --name a --content b
输出
name is: a
content is: b 3.3 cmd 只能访问到自己定义的 flag 值
注意将 flags 存储到本地变量当中那么其他命令「不可以」用某个命令的 局部flag。因为局部flag虽然是定义在某个命令文件中作为局部变量cmd 文件夹下的其他文件可以访问这个变量但是其他命令如果没有定义自己的 局部flag 获取相同 flag 值的话获取到的值是该局部变量的零值。示例如下
// 1. 添加一个新命令helloworld cobra add helloworld// 2.输出content值
Run: func(cmd *cobra.Command, args []string) { fmt.Println(content is: , sunshine)
}// 3.执行命令 ./demo helloworld --content b
Error: unknown flag: --content // 输出错误未知flag, 原因就是该命令并未定义名为content的局部flag3.4 必填 flag
// init文件中增加flag定义
versionCmd.Flags().StringVarP(sunshine, content, c, , my content)
versionCmd.MarkFlagRequired(content)// 执行 ./demo version// 输出
Error: required flag(s) content not set // 说明必须要设置flag content// 传入content flag ./demo version --content b // 输出 content is: b3.5 全局 flag 配置
MinimumNArgs(int) 当参数数目低于配置的最小参数个数时报错
MaximumNArgs(int) 当参数数目大于配置的最大参数个数时报错
ExactArgs(int) 如果参数数目不是配置的参数个数时报错
NoArgs 没有参数则报错 示例如下
// 添加一个命令path cobra add path// 设置该命令需要且仅需要一个参数并在Run方法中取出参数
var pathCmd cobra.Command{ Use: path [path],Short: A brief description of your command,Long: , Args: cobra.ExactArgs(1),Run: func(cmd *cobra.Command, args []string) {fmt.Println(path called)fmt.Println(path:, args[0])},
}// 执行命令并输出 ./demo path /home // 输出path: /home