不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

  • 面向对象

  • 并发编程

  • 常用库

    • 01.fmt
    • 02.Time包
    • 03.encoding/json包
    • 04.Flag
    • 05.Log
    • 06.IO操作
    • 07.Strconv
    • 08.net/http
    • 09.Context
    • 10.反射
    • 11.zap日志包
    • 12.viper配置管理
    • 13.gRPC
    • 14.jwt-go
    • 15.go-wrk压测
    • 16.Makefile
    • 17.cobor
      • 01.cobra使用
        • 1.1 基本使用
        • 1.2 初始化结构说明
      • 02.cobra项目使用
        • 2.0 目录结构
        • 2.1 main.go
        • 2.2 cmd/root.go
        • 2.3 cmd/serve.go
        • 2.4 运行测试
    • 18.logrus
    • 19.cron定时
    • 20.machinery
    • 21.regexp2
    • 22.lo
    • 23.泛型
    • 24.pprof
  • 数据库操作

  • Beego框架

  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • 常用库
xiaonaiqiang
2022-01-10
目录

17.cobor

# 01.cobra使用

  • GitHub地址: https://github.com/spf13/cobra/blob/master/user_guide.md

  • 参考博客:https://www.qikqiak.com/post/create-cli-app-with-cobra/

  • 安装

go get -u github.com/spf13/cobra 
1

# 1.1 基本使用

  • 初始项目
$  mkdir cobra-demo && cd cobra-demo
$  go mod init cobra-demo
1
2
  • 2)下载cobra
# 强烈推荐配置该环境变量
$  export GOPROXY=https://goproxy.cn
$  go get -u github.com/spf13/cobra/cobra
1
2
3
  • 3)cobra init 命令来初始化 CLI 应用的脚手架
$ cobra init
1

# 1.2 初始化结构说明

  • 目录结构
├── cmd
│   └── root.go
└── main.go

1
2
3
4
  • main.go
package main

import "cobra-demo/cmd"

func main() {
	cmd.Execute()
}
1
2
3
4
5
6
7
  • cmd/root.go
package cmd

import (
	"os"
	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use:   "cobra-demo",
	Short: "A brief description of your application",
	Long: 
  Run: func(cmd *cobra.Command, args []string) {
    fmt.Println("Hello Cobra CLI")
  },
}

// 然后再执行 execute 方法
func Execute() {
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

// 每当执行或者调用命令的时候,它都会先执行 init 函数中的所有函数
func init() {
	rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • rootCmd 根命令就会首先运行 initConfig 函数,当所有的初始化函数执行完成后,才会执行 rootCmd 的 RUN: func 执行函数
  • 我们可以在 initConfig 函数里面添加一些 Debug 信息
func initConfig() {
    fmt.Println("I'm inside initConfig function in cmd/root.go")
}
1
2
3

# 02.cobra项目使用

# 2.0 目录结构

  • 目录结构
cobra-demo
├── cmd
│   ├── root.go
│   └── serve.go
└── main.go
1
2
3
4
5

# 2.1 main.go

package main

import "cobra-demo/cmd"

func main() {
	cmd.Execute()
}
1
2
3
4
5
6
7

# 2.2 cmd/root.go

package cmd

import (
	"errors"
	"github.com/spf13/cobra"
	"log"
	"os"
)

var rootCmd = &cobra.Command{
	Use:               "demo",  // 命令行时关键字
	Short:             "cobra demo example",  // 命令简单描述
	Long:              `cobra demo example ....`,  // 命令详细描述
	Args: func(cmd *cobra.Command, args []string) error {
		if len(args) < 1 {
			return errors.New("requires at least one arg")
		}
		return nil
	},
	PersistentPreRunE:      func(*cobra.Command, []string) error { return nil },
	Run: func(cmd *cobra.Command, args []string) {   // 钩子函数
		usageStr := `可以使用 -h 查看命令`
		log.Printf("%s\n", usageStr)
	},
}

// 第二步:然后再执行 execute 方法
func Execute() {
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

// 第一步:每当执行或者调用命令的时候,它都会先执行 init 函数中的所有函数
func init() {
	rootCmd.AddCommand(StartCmd)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 2.3 cmd/serve.go

package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"log"
)

var (
	config   string  // 启动配置文件位置
	port     string  // 启动端口号
	mode     string  // 启动模式
	StartCmd = &cobra.Command{
		// go run main.go server -c=config/settings.dev.yml
		Use:     "server",  // 启动时要添加 server关键字
		Short:   "Start API server",  // 对命令简单描述
		Example: "ferry server config/settings.yml",  // 运行命令例子
		PreRun: func(cmd *cobra.Command, args []string) {  // 钩子函数,在RunE前执行
			usage()
			setup()
		},
		RunE: func(cmd *cobra.Command, args []string) error {  // 钩子函数
			return run()
		},
	}
)

func init() {
	// 为 Command 添加选项(flags)
	StartCmd.PersistentFlags().StringVarP(&config, "config", "c", "config/settings.yml", "Start server with provided configuration file")
	StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8002", "Tcp port server listening on")
	StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
}

// 记录日志
func usage() {
	usageStr := `starting api server`
	log.Printf("%s\n", usageStr)
}

// 初始化项目
func setup() {
	// 1. 读取配置
	fmt.Println("启动命令配置文件:",config)
	// 2. 初始化数据库链接
	// 3. 启动异步任务队列
}

func run() error {
	// 1.获取当前启动模式
	fmt.Println("启动命令当前模式:", mode)
	// 2.获取当前启动端口
	fmt.Println("启动命令当前端口", port)
	return nil
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 2.4 运行测试

  • 我们可以根据当前命令行传入的 配置文件位置、端口号、启动模式 来启动项目
xiaonaiqiang1@ZBMac-C02CW08SM cobra-demo %  go run main.go server -c=config/settings.dev.yml -p=8888 -m=release
2021/12/23 11:09:12 starting api server
启动命令配置文件: config/settings.dev.yml
启动命令当前模式: release
启动命令当前端口 8888
1
2
3
4
5
上次更新: 2024/3/13 15:35:10
16.Makefile
18.logrus

← 16.Makefile 18.logrus→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式