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:

  1. // command/cmd/demo_simple.go 中的代码
  2. package demo_simple
  3. import (
  4. "github.com/spf13/cobra"
  5. "goskeleton/app/global/variable"
  6. "time"
  7. )
  8. var (
  9. LogAction string
  10. Date string
  11. logger = variable.ZapLog.Sugar()
  12. )
  13. // 简单示例
  14. var DemoSimple = &cobra.Command{
  15. Use: "demo_simple",
  16. Aliases: []string{"demo_simple"}, // 定义别名
  17. Short: "这是一个最简单的demo示例",
  18. Long: `调用方法:
  19. 1.进入项目根目录(Ginkeleton)。
  20. 2.执行 go run cmd/cli/main.go demo_simple -h //可以查看使用指南
  21. 3.执行 go run cmd/cli/main.go demo_simple -A create // 通过 Action 动作执行相应的命令
  22. `,
  23. // Run 命令是 核心 命令,其余命令都是为该命令服务,可以删除,由您自由选择
  24. Run: func(cmd *cobra.Command, args []string) {
  25. //args 参数表示非flag(也叫作位置参数),该参数默认会作为一个数组存储。
  26. //fmt.Println(args)
  27. start(LogAction, Date)
  28. },
  29. }
  30. // 注册命令、初始化参数
  31. func init() {
  32. DemoSimple.Flags().StringVarP(&LogAction, "logAction", "A", "insert", "-A 指定参数动作,例如:-A insert ")
  33. DemoSimple.Flags().StringVarP(&Date, "date", "D", time.Now().Format("2006-01-02"), "-D 指定日期,例如:-D 2021-09-13")
  34. }
  35. // 开始执行业务
  36. func start(actionName, Date string) {
  37. switch actionName {
  38. case "insert":
  39. logger.Info("insert 参数执行对应业务逻辑,Date参数值:" + Date)
  40. case "update":
  41. logger.Info("update 参数执行对应业务逻辑,Date参数值:" + Date)
  42. }
  43. }

步骤2:

  1. // command/root.go 中的核心代码
  2. func init() {
  3. // 如果子命令是存在于子目录,那么就需要在入口统一添加;
  4. // 如果和 root.go 同目录,则不需要像下一行一样添加
  5. RootCmd.AddCommand(demo_simple.DemoSimple)
  6. }

编译 cli 模式的程序和编译 web 程序类似,复制原来的代码如下:

  1. // 特别注意: 以下三个命令执行时,前后不要有空格,否则最后编译可能会报错,无法编译出最终可执行文件
  2. # 追加 env -w 表示将值写入环境变量,否则每次只是临时生效,
  3. # 对于运行在linux服务器的程序后续编译就不需要重复设置编译前的参数,如果程序最终运行在windows,则编译参数 GOOS=windows
  4. go env -w GOARCH=amd64 // cpu架构
  5. go env -w GOOS=linux // 程序运行的最终系统,linux、windows、darwin(苹果macos系统)
  6. go env -w CGO_ENABLED=0 // window编译设置Cgo模块关闭,因为windows上做cgo开发太麻烦,如果引用了Cgo库库,那么请在linux环境开发、编译
  7. // 编译出最终可执行文件,进入根目录(GinSkeleton所在目录,也就是 go.mod 所在的目录)
  8. // 编译时建议追加参数:-ldflags "-w -s" ,-w 表示去除调试信息,禁止gdb调试,-s 表示去除符号表(符号表在链接时起着按符号寻址的作用,静态编译后用不到)
  9. // 追加参数编译后的程序体积也会比原来减少25%左右.
  10. // web|api|cli 三个目录选择其一即可,表示编译的入口目录
  11. go build -o test_cli -ldflags "-w -s" cmd/cli/main.go

执行编译后的文件方法:

  1. // 查看操作帮助
  2. ./test_cli -h
  3. //查看具体命令的操作帮助
  4. ./test_cli demo_simple -h
  5. // 开始执行, -A 是开发时指定的参数接受变量, insert 是具体参数
  6. ./test_cli demo_simple -A insert

更多示例请点击如下连接,参考自带的 demo 目录以及 root.go 文件
在线代码预览