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
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)