You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

155 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

### cobra 概要
> 1.`cobra`是一款非常强大、好用的`command`模式包主要创建非http接口服务。
> 2.`cobra`的全方位功能、细节介绍请自行百度搜索,这里主要介绍如何在本项目骨架中快速使用`cobra`编写程序。
### 关于 cobra入口、业务目录
> 1.入口:`cmd/command/main.go`,主要用于编译。
> 2.业务代码目录:`command/cmd/`。
>
### cobra 快速使用指南
> 快速创建模板的方法主要有:
> 1.复制`command/cmd/demo.go`基于此模板自行修改。
> 2.进入`command` 目录,执行命令 `cobra add 业务模块名`,也可以快速创建出模板文件。
#### demo.go 代码介绍
```go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// demo示例文件我们假设一个场景
// 通过一个命令指定 搜索引擎(百度、搜狗、谷歌)、搜索类型(文本、图片)、关键词 执行一系列的命令
var (
// 1.定义一个变量,接收搜索引擎(百度、搜狗、谷歌)
SearchEngines string
// 2.搜索的类型(图片、文字)
SearchType string
// 3.关键词
KeyWords string
)
var logger = variable.ZapLog.Sugar()
// 定义命令
var demo = &cobra.Command{
Use: "sousuo",
Aliases: []string{"sou", "ss", "s"}, // 定义别名
Short: "这是一个demo以搜索内容进行演示业务逻辑...",
Long: `调用方法:
1.进入项目根目录Ginkeleton
2.执行 go run cmd/cli/main.go sousuo -h //可以查看使用指南
3.执行 go run cmd/cli/main.go sousuo 任意参数 // 快速运行一个demo
4.执行 go run cmd/cli/main.go sousuo -K 关键词 -E baidu -T img // 指定参数运行demo
`,
//Args: cobra.ExactArgs(2), // 限制非flag参数也叫作位置参数的个数必须等于 2 ,否则会报错
// Run命令以及子命令的前置函数
PersistentPreRun: func(cmd *cobra.Command, args []string) {
//如果只想作为子命令的回调,可以通过相关参数做判断,仅在子命令执行
logger.Infof("Run函数子命令的前置方法位置参数%v flag参数%s, %s, %s \n", args[0], SearchEngines, SearchType, KeyWords)
},
// Run命令的前置函数
PreRun: func(cmd *cobra.Command, args []string) {
logger.Infof("Run函数的前置方法位置参数%v flag参数%s, %s, %s \n", args[0], SearchEngines, SearchType, KeyWords)
},
// Run 命令是 核心 命令,其余命令都是为该命令服务,可以删除,由您自由选择
Run: func(cmd *cobra.Command, args []string) {
//args 参数表示非flag也叫作位置参数该参数默认会作为一个数组存储。
//fmt.Println(args)
start(SearchEngines, SearchType, KeyWords)
},
// Run命令的后置函数
PostRun: func(cmd *cobra.Command, args []string) {
logger.Infof("Run函数的后置方法位置参数%v flag参数%s, %s, %s \n", args[0], SearchEngines, SearchType, KeyWords)
},
// Run命令以及子命令的后置函数
PersistentPostRun: func(cmd *cobra.Command, args []string) {
//如果只想作为子命令的回调,可以通过相关参数做判断,仅在子命令执行
logger.Infof("Run函数子命令的后置方法位置参数%v flag参数%s, %s, %s \n", args[0], SearchEngines, SearchType, KeyWords)
},
}
// 注册命令、初始化参数
func init() {
rootCmd.AddCommand(demo)
demo.Flags().StringVarP(&SearchEngines, "Engines", "E", "baidu", "-E 或者 --Engines 选择搜索引擎例如baidu、sogou")
demo.Flags().StringVarP(&SearchType, "Type", "T", "img", "-T 或者 --Type 选择搜索的内容类型,例如:图片类")
demo.Flags().StringVarP(&KeyWords, "KeyWords", "K", "关键词", "-K 或者 --KeyWords 搜索的关键词")
//demo.Flags().BoolP(1,2,3,5) //接收bool类型参数
//demo.Flags().Int64P() //接收int型
}
//开始执行
func start(SearchEngines, SearchType, KeyWords string) {
logger.Infof("您输入的搜索引擎:%s 搜索类型:%s, 关键词:%s\n", SearchEngines, SearchType, KeyWords)
}
```
#### 运行以上代码
```go
go run cmd/cli/main.go sousuo 测试demo -E 百度 -T 图片 -K 关键词
// 结果
Run函数子命令的前置方法位置参数测试demo flag参数百度, 图片, 关键词
Run函数的前置方法位置参数测试demo flag参数百度, 图片, 关键词
您输入的搜索引擎:百度, 搜索类型:图片, 关键词:关键词
Run函数的后置方法位置参数测试demo flag参数百度, 图片, 关键词
Run函数子命令的后置方法位置参数测试demo flag参数百度, 图片, 关键词
```
#### 子命令的定义与使用
```go
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// 定义子命令
var subCmd = &cobra.Command{
Use: "subCmd",
Short: "subCmd 命令简要介绍",
Long: `命令使用详细介绍`,
Args: cobra.ExactArgs(1), // 限制非flag参数的个数 = 1 ,超过1个会报错
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("测试子命令被嵌套调用:" + args[0])
},
}
//注册子命令
func init() {
demo.AddCommand(subCmd)
// 子命令仍然可以定义 flag 参数,相关语法参见 demo.go 文件
}
```
#### 运行以上代码
```go
go run cmd/cli/main.go sousuo subCmd 子命令参数
// 结果
Run函数子命令的前置方法位置参数子命令参数 flag参数baidu, img, 关键词
子命令参数
Run函数子命令的后置方法位置参数子命令参数 flag参数baidu, img, 关键词
```
#### 如果文件分布在子目录,创建方式
[创建子目录命令](https://gitee.com/daitougege/gin-skeleton-admin-backend/tree/master/command/cmd)