cobra 概要
1.cobra
是一款非常强大、好用的command
模式包,主要创建非http接口服务。
2.cobra
的全方位功能、细节介绍请自行百度搜索,这里主要介绍如何在本项目骨架中快速使用cobra
编写程序。
关于 cobra入口、业务目录
1.入口:cmd/command/main.go
,主要用于编译。
2.业务代码目录:command/cmd/
。
cobra 快速使用指南
快速创建模板的方法主要有:
1.复制command/cmd/demo_simple.go
基于此模板自行修改。
2.在 command/root.go
文件中添加上述命令。
步骤1:
// command/cmd/demo_simple.go 中的代码
package demo_simple
import (
"github.com/spf13/cobra"
"goskeleton/app/global/variable"
"time"
)
var (
LogAction string
Date string
logger = variable.ZapLog.Sugar()
)
// 简单示例
var DemoSimple = &cobra.Command{
Use: "demo_simple",
Aliases: []string{"demo_simple"}, // 定义别名
Short: "这是一个最简单的demo示例",
Long: `调用方法:
1.进入项目根目录(Ginkeleton)。
2.执行 go run cmd/cli/main.go demo_simple -h //可以查看使用指南
3.执行 go run cmd/cli/main.go demo_simple -A create // 通过 Action 动作执行相应的命令
`,
// Run 命令是 核心 命令,其余命令都是为该命令服务,可以删除,由您自由选择
Run: func(cmd *cobra.Command, args []string) {
//args 参数表示非flag(也叫作位置参数),该参数默认会作为一个数组存储。
//fmt.Println(args)
start(LogAction, Date)
},
}
// 注册命令、初始化参数
func init() {
DemoSimple.Flags().StringVarP(&LogAction, "logAction", "A", "insert", "-A 指定参数动作,例如:-A insert ")
DemoSimple.Flags().StringVarP(&Date, "date", "D", time.Now().Format("2006-01-02"), "-D 指定日期,例如:-D 2021-09-13")
}
// 开始执行业务
func start(actionName, Date string) {
switch actionName {
case "insert":
logger.Info("insert 参数执行对应业务逻辑,Date参数值:" + Date)
case "update":
logger.Info("update 参数执行对应业务逻辑,Date参数值:" + Date)
}
}
步骤2:
// command/root.go 中的核心代码
func init() {
// 如果子命令是存在于子目录,那么就需要在入口统一添加;
// 如果和 root.go 同目录,则不需要像下一行一样添加
RootCmd.AddCommand(demo_simple.DemoSimple)
}
编译 cli 模式的程序和编译 web 程序类似,复制原来的代码如下:
// 特别注意: 以下三个命令执行时,前后不要有空格,否则最后编译可能会报错,无法编译出最终可执行文件
# 追加 env -w 表示将值写入环境变量,否则每次只是临时生效,
# 对于运行在linux服务器的程序后续编译就不需要重复设置编译前的参数,如果程序最终运行在windows,则编译参数 GOOS=windows
go env -w GOARCH=amd64 // cpu架构
go env -w GOOS=linux // 程序运行的最终系统,linux、windows、darwin(苹果macos系统)
go env -w CGO_ENABLED=0 // window编译设置Cgo模块关闭,因为windows上做cgo开发太麻烦,如果引用了Cgo库库,那么请在linux环境开发、编译
// 编译出最终可执行文件,进入根目录(GinSkeleton所在目录,也就是 go.mod 所在的目录)
// 编译时建议追加参数:-ldflags "-w -s" ,-w 表示去除调试信息,禁止gdb调试,-s 表示去除符号表(符号表在链接时起着按符号寻址的作用,静态编译后用不到)
// 追加参数编译后的程序体积也会比原来减少25%左右.
// web|api|cli 三个目录选择其一即可,表示编译的入口目录
go build -o test_cli -ldflags "-w -s" cmd/cli/main.go
执行编译后的文件方法:
// 查看操作帮助
./test_cli -h
//查看具体命令的操作帮助
./test_cli demo_simple -h
// 开始执行, -A 是开发时指定的参数接受变量, insert 是具体参数
./test_cli demo_simple -A insert
更多示例请点击如下连接,参考自带的 demo 目录以及 root.go 文件
在线代码预览