go如何使用cobra启动项目

 更新时间:2025年11月26日 10:42:49   作者:水痕01  
本文介绍了如何使用Go语言的Cobra库来启动项目,包括基本使用和项目开发中的具体实现,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、基本使用

1、安装依赖包

go get -u github.com/spf13/cobra@latest

2、简单的创建几个命令

package main
import (
	"github.com/spf13/cobra"
	"os"
)
var rootCmd = &cobra.Command{
	Use:   "api",
	Short: "短的地址",
	Long:  "长的地址",
}
// 命令一
var mockCmd = &cobra.Command{
	Use:   "mock",
	Short: "mock短的",
	Long:  "mock长的",
}
// 命令二
var exportCmd = &cobra.Command{
	Use:   "export",
	Short: "export短的",
	Long:  "export长的",
}
func main() {
	rootCmd.AddCommand(mockCmd)
	rootCmd.AddCommand(exportCmd)
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

3、运行上面的代码

go run main.go mock ---> 输出mock长的
go run main.go export --> export长的

4、常见的字段说明

  • PersistentPreRunE执行之前,且在任何子命令运行之前都会调用
  • PersistentPostRun执行之后,且在所有子命令执行后都会调用
  • RunE当命令的主要逻辑执行时触发,即命令的核心功能实现

5、加载外面传递的参数

先定义接收的变量

var name string

使用命名接收外面的数据

func init() {
	rootCmd.PersistentFlags().StringVarP(&name, "name", "n", "", "外部传递值进来")
}

运行命令

go run main.go export -n=hello

二、实现项目中开发使用

1、比如我们日常gin项目开发

├── api
│   └── service.go
├── cmd
│   ├── root.go
│   └── start.go
├── config
│   └── config.go
├── etc
│   ├── application.dev.yml
│   └── application.prod.yml
├── main.go

2、cmd/root.go的文件

package cmd
import (
	"fmt"
	"gin-admin-api/test251119/config"
	"github.com/spf13/cobra"
	"os"
)
var (
	cfgFile string
	cfg     *config.Config
)
var rootCmd = &cobra.Command{
	Use:   "cmd",
	Short: "gin项目开发启动",
	Long:  "gin项目开发启动",
	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
		if cmd.Name() == "help" {
			return nil
		}
		// 加载配置文件
		var err error
		cfg, err = config.Load(cfgFile)
		if err != nil {
			return fmt.Errorf("加载配置文件失败: %w", err)
		}
		return nil
	},
	PersistentPostRun: func(cmd *cobra.Command, args []string) {
		// TODO 可以做数据库的关闭
	},
}
func init() {
	rootCmd.PersistentFlags().StringVarP(&cfgFile, "etc", "c", "etc/application.dev.yml", "请输入启动的配置文件")
}
func Execute() {
	rootCmd.AddCommand(cmdStart)
	err := rootCmd.Execute()
	if err != nil {
		os.Exit(1)
	}
}

3、cmd/start.go文件

package cmd
import (
	"fmt"
	"gin-admin-api/test251119/api"
	"github.com/spf13/cobra"
	"os"
)
var cmdStart = &cobra.Command{
	Use:   "start",
	Short: "启动项目",
	Long:  "启动项目",
	Run: func(cmd *cobra.Command, args []string) {
		if err := startDaemon(); err != nil {
			fmt.Fprintf(os.Stderr, "Error: %v\n", err)
			os.Exit(1)
		}
	},
}
func startDaemon() error {
	server := api.NewServer(cfg)
	err := server.ListenAndServe()
	return err
}

4、config/config.go文件内容

package config
import (
	"fmt"
	"github.com/spf13/viper"
	"os"
	"path/filepath"
)
type Config struct {
	Port int `mapstructure:"port"` // 启动端口
}
// Load loads configuration from file
func Load(cfgFile string) (*Config, error) {
	v := viper.New()
	if cfgFile != "" {
		v.SetConfigFile(cfgFile)
	} else {
		configDir := "./etc"
		if _, err := os.Stat(configDir); os.IsNotExist(err) {
			if err := os.MkdirAll(configDir, 0755); err != nil {
				return nil, fmt.Errorf("创建目录失败: %w", err)
			}
		}
		v.AddConfigPath(configDir)
		v.SetConfigName("application.dev")
		v.SetConfigType("yml")
		configPath := filepath.Join(configDir, "application.dev.yml")
		if _, err := os.Stat(configPath); os.IsNotExist(err) {
			fmt.Println("Config file not found, creating default config:", configPath)
			// Copy example file if it exists
			examplePath := filepath.Join(configDir, "application.dev.example")
			if _, err := os.Stat(examplePath); err == nil {
				if exampleData, err := os.ReadFile(examplePath); err == nil {
					if err := os.WriteFile(configPath, exampleData, 0644); err != nil {
						fmt.Printf("写入默认配置文件失败: %v\n", err)
					} else {
						fmt.Println("读取默认配置文件 成功")
					}
				}
			}
		}
	}
	// 设置默认值
	v.SetDefault("port", ":8080")
	if err := v.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("reading config file: %w", err)
	}
	fmt.Println("Using config file:", v.ConfigFileUsed())
	var config Config
	if err := v.Unmarshal(&config); err != nil {
		return nil, fmt.Errorf("unmarshaling config: %w", err)
	}
	return &config, nil
}

5、api/service.go文件内容

package api
import (
	"fmt"
	"gin-admin-api/test251119/config"
	"github.com/gin-gonic/gin"
	"net/http"
)
type Server struct {
	server *http.Server
	router *gin.Engine
	config *config.Config
}
// NewServer 创建新的 Server 实例
func NewServer(cfg *config.Config) *Server {
	gin.SetMode(gin.DebugMode)
	router := gin.Default()
	router.Use(gin.Recovery())
	// 创建 HTTP 服务器
	srv := &http.Server{
		Addr:    fmt.Sprintf(":%d", cfg.Port),
		Handler: router,
	}
	return &Server{
		server: srv,
		router: router,
		config: cfg,
	}
}
// ListenAndServe 启动服务并监听端口
func (s *Server) ListenAndServe() error {
	fmt.Printf("服务启动:http://localhost:%d\n", s.config.Port)
	// 启动服务并修复端口格式
	return s.server.ListenAndServe()
}

6、application.dev.yml文件

port: 9000
salt: abcdef

7、启动文件main.go

package main
import "gin-admin-api/test251119/cmd"
func main() {
	cmd.Execute()
}

8、启动

go run main.go start  默认使用dev文件
go run main.go start -c etc/application.prod.yml

到此这篇关于go使用cobra来启动项目的文章就介绍到这了,更多相关go cobra启动项目内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go Map并发冲突预防与解决

    Go Map并发冲突预防与解决

    这篇文章主要为大家介绍了Go Map并发冲突预防与解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 重学Go语言之错误处理与异常机制详解

    重学Go语言之错误处理与异常机制详解

    Go语言的开发者显然觉得 try-catch被滥用了,因此 Go不支持使用 try-catch语句捕获异常处理,那么,Go语言是如何定义和处理程序的异常呢,下面我们就来看看吧
    2023-08-08
  • Golang错误处理:异常捕捉和恢复机制

    Golang错误处理:异常捕捉和恢复机制

    Golang中,异常处理是通过 defer + panic + recover 的方式来实现的,使用 defer 可以将清理操作注册到函数执行完毕后执行,而 panic 和 recover 可以用于处理异常,通过组合使用这些功能,可以实现更加健壮的程序
    2024-01-01
  • Go语言学习之文件操作方法详解

    Go语言学习之文件操作方法详解

    这篇文章主要为大家详细介绍了Go语言中一些常见的文件操作,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-04-04
  • 一文带你了解Go语言中方法的调用

    一文带你了解Go语言中方法的调用

    这篇文章主要和大家分享一下Go语言中的方法的调用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
    2022-12-12
  • Go一站式配置管理工具Viper的使用教程

    Go一站式配置管理工具Viper的使用教程

    Viper是一个方便Go语言应用程序处理配置信息的库,它可以处理多种格式的配置,这篇文章主要为大家介绍了它的具体使用教程,需要的可以参考下
    2023-08-08
  • GO语言映射(Map)用法分析

    GO语言映射(Map)用法分析

    这篇文章主要介绍了GO语言映射(Map)用法,以实例形式较为详细的分析了针对映射的创建、填充、遍历及修改等操作的技巧,需要的朋友可以参考下
    2014-12-12
  • golang用melody搭建轻量的websocket服务的示例代码

    golang用melody搭建轻量的websocket服务的示例代码

    在Go中,可以使用gin和melody库来搭建一个轻量级的WebSocket服务,gin是一个流行的Web框架,而melody是一个用于处理WebSocket的库,本文给大家演示如何使用gin和melody搭建WebSocket服务,感兴趣的朋友一起看看吧
    2023-10-10
  • Go中Gzip与json搭配实现数据压缩demo

    Go中Gzip与json搭配实现数据压缩demo

    这篇文章主要为大家介绍了Go中Gzip与json搭配使用压缩数据的实现demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • golang调用windows平台的dll库的方法实现

    golang调用windows平台的dll库的方法实现

    本文主要介绍了golang调用windows平台的dll库的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03

最新评论