首页 > 其他分享 >golang命令行cobra学习

golang命令行cobra学习

时间:2024-02-06 23:11:07浏览次数:16  
标签:cobra StartCmd server golang 命令 mode 命令行 config port

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

 

标签:cobra,StartCmd,server,golang,命令,mode,命令行,config,port
From: https://www.cnblogs.com/kylin5201314/p/18010455

相关文章

  • UEFI Shell是Unified Extensible Firmware Interface(统一可扩展固件接口)的一部分,它是
    UEFIShell是UnifiedExtensibleFirmwareInterface(统一可扩展固件接口)的一部分,它是一种命令行界面,允许用户在计算机启动时直接与UEFI固件进行交互。UEFIShell提供了一些基本的命令和功能,可以用于管理系统设置、诊断问题、访问硬件信息等操作。为什么使用UEFIShell:系统维护:......
  • bcdedit是Windows操作系统中的一个命令行工具,用于查看和修改启动配置数据(BCD)。启动配
    bcdedit是什么bcdedit是Windows操作系统中的一个命令行工具,用于查看和修改启动配置数据(BCD)。启动配置数据存储重要的启动信息,包括启动加载程序和启动设置。这个工具主要由高级用户、系统管理员和开发人员使用,以调整与系统启动相关的各种参数。为什么使用bcdedit修改启动设置......
  • powercfg是一个Windows操作系统中的命令行工具,用于管理和配置电源设置。通过使用power
    powercfg是一个Windows操作系统中的命令行工具,用于管理和配置电源设置。通过使用powercfg命令,用户和系统管理员可以查询、更改、导出、导入电源计划设置,检查电池状态,以及分析系统能耗情况等。这个工具非常有用,尤其是在需要优化电池使用时间、调整电源计划以提高性能或节能时。为......
  • golang之设计模式
    [选项模式]packagemainimport"fmt"typeOptionFuncfunc(*DoSomethingOption)typeDoSomethingOptionstruct{aintbstringcbool}funcNewDoSomethingOption(cbool,opts...OptionFunc)*DoSomethingOption{s:=&DoSomethi......
  • 解决golang依赖库被删库问题
    调用的开源库引用了github个人仓库,如果作者删除了仓库或者改成私人仓库,那么gomodtidy就会失败以github.com/mitchellh/osext为例,作者因为某些原因删除了仓库,并给出了替代的官方仓库github.com/kardianos/osext使用replace命令gomodedit-replace[oldgitpackage]@[versi......
  • Golang Grpc-Gateway生成-buf版
    官网有个工具buf可以自动生成https://github.com/bufbuild/buf/releases按照自己的平台下载对应的文件,并把可执行文件加入到环境变量下proto同级目录下新增buf.gen.yaml或者执行bufmodinit,buf默认会扫描所有文件夹的*.proto,所以我在同级目录下创建version:v1plugins:-......
  • Golang Grpc-Gateway生成-基础版
    时间久了不用就会忘记指令,这里做个笔记创建一个文件//+buildtoolspackagetoolsimport(_"github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway"_"github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2"_"google.gol......
  • 方法的重载和命令行传参
    方法的重载重载就是在一个类中,有相同的函数名称,但形参不同的函数。方法的重载的规则:方法名称必须相同。参数列表必须不同。(个数不同、或类型不同,参数排列顺序不同等)方法的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为方法的重载。实现理论:方法名称相......
  • PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框
    PowerShell是一种跨平台的任务自动化解决方案,包括命令行shell、脚本语言和配置管理框架。PowerShell提供了丰富的命令(称为cmdlet),可以用来执行许多Windows管理任务,包括但不限于用户和组管理、文件系统操作、进程和服务管理等。下面列举一些常见的net命令以及它们在PowerShell中的对......
  • Python Fire:更加灵活的命令行参数
    之前介绍过Python的Fire库,一个用来生成命令行工具的的库。请参考:PythonFire:自动生成命令行接口今天,针对命令行参数,补充两种更加灵活的设置方式。1.*args型参数*args型的参数可以接受任意长度的参数。比如,模拟一个学校发送通知的功能:importfiredefnotions(school,*name......