golang命令行cobra学习

var rootCmd = &cobra.Command{
    Use:               "ferry",
    Short:             "-v",
    SilenceUsage:      true,
    DisableAutoGenTag: true,
    Long:              `ferry`,
    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 := `欢迎使用 ferry,可以使用 -h 查看命令`
        logger.Infof("%s\n", usageStr)
    },
}

Use 字段定义了命令的名字,用户在命令行中输入这个名字来调用这个命令。

Short 字段提供了命令的简短描述,通常用于帮助信息中。这里的描述可能是一个错误,因为 -v 通常用于版本信息,而不是一个描述。

SilenceUsage 字段设置为 true 时,如果命令执行出错,它会阻止打印用法信息。

DisableAutoGenTag 字段设置为 true 时,它会禁止在生成的帮助信息中添加日期标签。

Long 字段提供了命令的长描述,用于帮助信息中。这里的描述只是重复了命令的名字。

Args 字段定义了一个函数,用于验证传递给命令的参数。这个函数检查是否至少有一个参数,如果没有,返回一个错误。

PersistentPreRunE 字段定义了一个函数,它会在命令的任何子命令执行之前运行。在这个例子中,这个函数什么也不做,只是返回 nil。

Run 字段定义了一个函数,这个函数是命令的实际执行体。当用户运行 ferry 命令时,它会打印一条欢迎信息,并提示用户可以使用 -h 查看更多命令。

 

var (
    config   string
    port     string
    mode     string
    StartCmd = &cobra.Command{
        Use:     "server",
        Short:   "Start API server",
        Example: "ferry server config/settings.yml",
        PreRun: func(cmd *cobra.Command, args []string) {
            usage()
            setup()
        },
        RunE: func(cmd *cobra.Command, args []string) error {
            return run()
        },
    }
)

func init() {
    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. 读取配置
    config2.ConfigSetup(config)
    // 2. 初始化数据库链接
    database.Setup()
    // 3. 启动异步任务队列
    go task.Start()

}

这里定义了三个全局变量 config、port 和 mode,以及 StartCmd 命令。这些变量将用于存储命令行参数。
Use 字段指定了子命令的名称,即 server。

Short 字段提供了命令的简短描述,用于帮助信息中。

Example 字段给出了一个命令的使用示例,帮助用户理解如何使用这个命令。

PreRun 字段定义了一个函数,它会在命令的 Run 函数执行之前运行。这个函数调用了 usage() 和 setup() 函数,可能用于打印用法信息和进行一些初始化设置。

RunE 字段定义了一个函数,这个函数是命令的实际执行体。它调用了 run() 函数,并返回可能发生的错误。如果 run() 函数返回错误,Cobra 会处理这个错误并打印出来。

init() 函数在包初始化时被自动调用。这里,它用于定义 StartCmd 命令的持久性标志(PersistentFlags),这些标志将保持在命令及其所有子命令中。StringVarP 方法用于绑定一个字符串变量到一个特定的标志。

usage() 函数定义了一个简单的用法信息打印功能,它可能被 PreRun 中调用。

总的来说,这段代码定义了一个 server 子命令,它具有三个持久性标志(config、port 和 mode),并在执行前打印用法信息和进行设置。当执行时,它会调用 run() 函数来启动 API 服务器。

 

func init() {
    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")
}

在 init() 函数中,StringVarP 方法用于绑定命令行标志与 Go 语言中的变量。这里是 cobra 库的一个功能,它允许你为命令行工具定义和解析标志。下面是 StringVarP 方法参数的详细解释:

StartCmd.PersistentFlags().StringVarP(&config, "config", "c", "config/settings.yml", "Start server with provided configuration file")
&config: 这是一个指向变量的指针,该变量将存储从命令行标志传递的值。
"config": 这是长标志的名称,在命令行中使用 --config 来指定。
"c": 这是短标志的名称,在命令行中使用 -c 来指定。
"config/settings.yml": 这是标志的默认值,如果用户没有在命令行中提供值,将使用这个默认值。
"Start server with provided configuration file": 这是标志的描述,用于帮助信息中,告诉用户这个标志的用途。
同样的解释适用于其他两个 StringVarP 方法调用:

StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8002", "Tcp port server listening on")
&port: 指向存储端口值的变量的指针。
"port": 长标志名称,使用 --port。
"p": 短标志名称,使用 -p。
"8002": 默认端口值。
"Tcp port server listening on": 描述端口标志的用途。
StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
&mode: 指向存储模式值的变量的指针。
"mode": 长标志名称,使用 --mode。
"m": 短标志名称,使用 -m。
"dev": 默认模式值。
"server mode ; eg:dev,test,prod": 描述模式标志的用途。
通过这些方法调用,StartCmd 命令现在有了三个可配置的标志:--config(或 -c),--port(或 -p),和 --mode(或 -m)。用户可以在命令行中使用这些标志来指定配置文件、监听端口和服务器模式。

假如我用命令我该怎么用呢

如果你想使用定义好的 StartCmd 命令来启动服务器,并且你已经按照上面的代码设置了命令行标志,你可以通过以下方式在命令行中使用这些标志:

ferry server --config path/to/config.yml --port 8080 --mode prod
或者使用短标志版本:

ferry server -c path/to/config.yml -p 8080 -m prod

 

go卸载升级go版本

https://blog.csdn.net/jxwBlog/article/details/129861207

 

posted @ 2024-02-06 23:06  Οo白麒麟оΟ  阅读(281)  评论(0编辑  收藏  举报