【34】cobra 框架

一. cobra是什么

cobra是一个命令行程序库,可以用来编写命令行程序。同时,它也提供了一个脚手架,用于生成基于 cobra 的应用程序框架。非常多知名的开源项目使用了 cobra 库构建命令行,如Kubernetes、Hugo、etcd等等等等。

二. 引入cobra库

bash 复制代码
go get -u github.com/spf13/cobra

三. go示例代码

Go 复制代码
package main

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

var (
	Verbose    bool
	ConfigPath string
	SomeString string
)

func main() {
	Execute()
	return
}

var rootCmd = &cobra.Command{
	Use:   "root",
	Short: "the short description shown in the 'help' output.",
	Long: `root description detail
			Long is the long message shown in the 'help <this-command>' output.`,
	Run: func(cmd *cobra.Command, args []string) {
		// Do Stuff Here
		fmt.Printf("root verbose: %v\n", Verbose)
		fmt.Printf("root config: %s\n", ConfigPath)
		fmt.Printf("root string: %s\n", SomeString)
	},
}

func Execute() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

var apiCmd = &cobra.Command{
	Use:   "api",
	Short: "api short description",
	Long:  `api long description`,
	Run: func(cmd *cobra.Command, args []string) {
		// Do Stuff Here
		fmt.Printf("api verbose: %v\n", Verbose)
		fmt.Printf("api config: %s\n", ConfigPath)
		fmt.Printf("api string: %s\n", SomeString)
	},
}

var adminCmd = &cobra.Command{
	Use:   "admin",
	Short: "admin short description",
	Long:  `admin long description`,
	Run: func(cmd *cobra.Command, args []string) {
		// Do Stuff Here
		fmt.Printf("admin verbose: %v\n", Verbose)
		fmt.Printf("admin config: %s\n", ConfigPath)
		fmt.Printf("admin string: %s\n", SomeString)
	},
}

var apiChildCmd = &cobra.Command{
	Use:   "apiChild",
	Short: "apiChild short description",
	Long:  `apiChild long description`,
	Run: func(cmd *cobra.Command, args []string) {
		// Do Stuff Here
		fmt.Printf("apiChild verbose: %v\n", Verbose)
		fmt.Printf("apiChild config: %s\n", ConfigPath)
        fmt.Printf("apiChild string: %s\n", SomeString)
	},
}

func init() {
	rootCmd.AddCommand(apiCmd, adminCmd)
	apiCmd.AddCommand(apiChildCmd)
	// persistent是全局选项,对应的方法为PersistentFlags
	rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "全局版本")
	rootCmd.PersistentFlags().StringVarP(&SomeString, "string", "s", "null", "字符串")
	// local为本地选项,对应方法为Flags,只对指定的Command生效
	apiCmd.Flags().StringVarP(&ConfigPath, "config", "c", "", "读取文件路径")
}

// persistent是全局选项,对应的方法为PersistentFlags

rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "全局版本")

rootCmd.PersistentFlags().StringVarP(&SomeString, "string", "s", "null", "字符串")

// local为本地选项,对应方法为Flags,只对指定的Command生效

apiCmd.Flags().StringVarP(&ConfigPath, "config", "c", "", "读取文件路径")

四. 结果

Go 复制代码
go run ./main.go -v -s aaa
root verbose: true
root config: 
root string: aaa
Go 复制代码
 go run ./main.go api -v -s aaa -c config
api verbose: true
api config: config
api string: aaa
Go 复制代码
go run ./main.go api apiChild -v -s aaa          
apiChild verbose: true
apiChild config: 
apiChild string: aaa

只有api可以设置-c参数

五. 添加svc库

svc库将服务分为初始化、启动服务、结束服务三个阶段。

引入svc包

复制代码
go get -u github.com/judwhite/go-svc

与cobra结合,如下为项目启动示例代码

Go 复制代码
func main() {
	Execute()
	return
}

var rootCmd = &cobra.Command{
	Use:   "server",
	Short: "",
	Long:  "",
	Run: func(cmd *cobra.Command, args []string) {

	},
}

func Execute() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}


type Application struct {
}

var cfgFile *string

var startCmd = &cobra.Command{
	Use:   "start",
	Short: "start the api server",
	Long: `usage example:
	server(.exe) start -c apollo.json
	start the server`,
	Run: func(cmd *cobra.Command, args []string) {
		app := &Application{}
		if err := svc.Run(app, syscall.SIGINT, syscall.SIGTERM); err != nil {
			fmt.Println(err)
		}
	},
}

func init() {
	rootCmd.AddCommand(startCmd)
	cfgFile = startCmd.Flags().StringP("config", "c", "", "config file (required)")
	startCmd.MarkFlagRequired("config")
}

func (app *Application) Init(env svc.Environment) error {
	// do init

	return nil
}

func (app *Application) Start() error {
	// do start

	return nil
}

func (app *Application) Stop() error {
	// do stop

	return nil
}
相关推荐
西京刀客2 小时前
go语言-切片排序之sort.Slice 和 sort.SliceStable 的区别(数据库分页、内存分页场景注意点)
后端·golang·sort·数据库分页·内存分页
黄昏单车3 小时前
golang语言基础到进阶学习笔记
笔记·golang·go
moxiaoran575312 小时前
Go语言结构体
开发语言·后端·golang
Tony Bai20 小时前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
小徐Chao努力1 天前
Go语言核心知识点底层原理教程【变量、类型与常量】
开发语言·后端·golang
锥锋骚年1 天前
go语言异常处理方案
开发语言·后端·golang
moxiaoran57531 天前
Go语言的map
开发语言·后端·golang
小信啊啊1 天前
Go语言数组
开发语言·后端·golang
IT艺术家-rookie1 天前
golang-- sync.WaitGroup 和 errgroup.Group 详解
开发语言·后端·golang
树下水月1 天前
Go语言编码规范
开发语言·后端·golang