首页 > 其他分享 >golang项目搭建笔记-cobra

golang项目搭建笔记-cobra

时间:2023-09-17 20:26:43浏览次数:42  
标签:... cobra string default golang hi go 搭建

cobra介绍

GitHub地址

cobra中,一个命令主要概念为command,arguement,flag,可以理解为谓语、宾语、状语

格式为APPNAME COMMAND ARG --FLAG,例如:

git clone URL --bare

项目搭建

cobra提供了非常方便的工具cobra-cli,可以快速添加命令,参考官方文档

  1. 新建项目

    # 进入项目目录
    go mod init github.com/{your name}/{your project name}
    
  2. 添加依赖

    go get -u github.com/spf13/cobra@latest
    
  3. 安装cobra-cli

    go install github.com/spf13/cobra-cli@latest
    
  4. 使用cobra-cli进行项目初始化

    cobra-cli init
    

    此时已经自动创建好了main.go、cmd目录、LICENSE文件,项目目录结构为

    .
    ├── LICENSE
    ├── cmd
    │   └── root.go
    ├── go.mod
    ├── go.sum
    └── main.go
    
  5. 使用cobra-cli添加命令

    # cobra-cli add [command name]
    cobra-cli add greet
    

    此时在cmd目录下多了个hi.go文件

    .
    ├── LICENSE
    ├── cmd
    │   ├── greet.go
    │   └── root.go
    ├── go.mod
    ├── go.sum
    └── main.go
    

    测试运行

    go run . greet
    # 运行结果
    # greet called
    

    也可添加子命令,如:

    cobra-cli add hi -p greetCmd
    

    此时目录结构:

    .
    ├── LICENSE
    ├── cmd
    │   ├── greet.go
    │   ├── hi.go
    │   └── root.go
    ├── go.mod
    ├── go.sum
    └── main.go
    

    hi.go文件中使用greetCmd.AddCommand(hiCmd)声明了命令的父子关系。

理解command

以hi.go为例,首先定义了一个cobra.Command{}结构体:

// hiCmd represents the hi command
var hiCmd = &cobra.Command{
	Use:   "hi",
	Short: "A brief description of your command",
	Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("hi called")
	},
}

运行帮助命令go run . greet hi -h,控制台显示:

A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.

Usage:
  Learn_Cobra greet hi [flags]

Flags:
  -h, --help   help for hi

Use

Use属性第一个单词为实际命令,后面的为介绍(经测试,这个介绍只是起一个展示作用,与实际语法无关,后文会介绍。),比如修改Use属性为:

...
	Use:   "hi this is a sentence",
...

运行帮助命令go run . greet hi -h,控制台显示:

...
Usage:
  Learn_Cobra greet hi this is a sentence [flags]
...

这个只是测试,不推荐这么写,记得改回去。

一般Use属性推荐使用固定语法,可见源码command.go:

...
	// Use is the one-line usage message.
	// Recommended syntax is as follows:
	//   [ ] identifies an optional argument. Arguments that are not enclosed in brackets are required.
	//   ... indicates that you can specify multiple values for the previous argument.
	//   |   indicates mutually exclusive information. You can use the argument to the left of the separator or the
	//       argument to the right of the separator. You cannot use both arguments in a single use of the command.
	//   { } delimits a set of mutually exclusive arguments when one of the arguments is required. If the arguments are
	//       optional, they are enclosed in brackets ([ ]).
	// Example: add [-F file | -D dir]... [-f format] profile
	Use string
...

Short、Long

顾名思义,略

Run

这是程序实际开始执行的地方。

尝试打印参数列表:

...
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println(args)
		fmt.Println("hi called")
	},
...

运行

go run . greet hi 12 32
# 运行结果
# [12 32]
# hi called

怎么获取flags见下文。

设置命令父子关系

init()方法中,第一行代码就是设置子命令的代码:

...
	greetCmd.AddCommand(hiCmd)
...

初学者需要注意,init()方法是在一个包被导入的时候,自动调用的函数,所以这里给Command做一些加工。

设置flags

PersistentFlags VS Flags

PersistentFlags是可以被子命令继承的特殊的Flag,而Flag只能在当前命令中使用,两者都可以通过Flags()获取值,只有在当前命令定义时,才能使用PersistentFlags()获取值。

设置flags

每种数据类型都有各种定义的方法,以string类型为例:

  • String(name string, value string, usage string)

    基本方法,定义了flag名称、默认值、使用描述。

  • StringP(name, shorthand string, value string, usage string)

    比第一种多了一个shorthand,短文本,只支持一个ASCII字符,使用时只需要一个短横线“-”。

  • StringVar(p *string, name string, value string, usage string)

    比第一种多了一个指向一个字符串变量的指针,读取的flag值会赋值到对应的字符串变量。

  • StringVarP(p *string, name, shorthand string, value string, usage string)

    第二种和第三种的结合体

示例,修改hi.go文件:

// hiCmd represents the hi command
var hiCmd = &cobra.Command{
	Use:   "hi",
	Short: "A brief description of your command",
	Long:  `A longer description`,
	Run: func(cmd *cobra.Command, args []string) {
		aa, _ := cmd.Flags().GetString("aa")
		bb, _ := cmd.Flags().GetString("bb")
		cc, _ := cmd.Flags().GetString("cc")
		fmt.Println(aa, bb, cc, s)
	},
}

var s string

func init() {
	greetCmd.AddCommand(hiCmd)

	hiCmd.Flags().String("aa", "default a", "this is flag a")
	hiCmd.Flags().StringP("bb", "b", "default b", "this is flag b")
	hiCmd.Flags().StringVar(&s, "cc", "default c", "this is flag c")
}

查看帮助:

go run . greet hi -h
...
Flags:
      --aa string   this is flag a (default "default a")
  -b, --bb string   this is flag b (default "default b")
      --cc string   this is flag c (default "default c")
  -h, --help        help for hi
...

运行:

go run . greet hi --aa hello
# hello default b default c default c

总结

知识根据cobre-cli生成的内容进行总结,后续会学viper,再和cobra整合。

标签:...,cobra,string,default,golang,hi,go,搭建
From: https://www.cnblogs.com/xujiahao718/p/17709694.html

相关文章

  • 30分钟快速搭建并部署一个免费的个人博客
    前言现如今网上有许多完善的博客平台,如博客园、掘金、思否、知乎等。有人会说为什么现在网上有这么多成熟的博客平台,你还要浪费时间搭建一个自己的博客系统呢?首先我相信每一个程序员都会想要拥有一个属于自己的博客系统,其次使用Docsify能够快速构建一个自己的博客文档系统,最后我......
  • DVWA靶场环境搭建+Phpstudy配置
    1、DVWA介绍在近些年网络安全的高速发展中,初学者已经很难找到一个网站进行渗透了,曾几何时,一个漏洞,一个工具就可以在网上找到很多有漏洞的网站去体验,当然渗透一个未经授权的系统是非法的。因此,为了能够较为真实地学习Web渗透的各种技术,就需要找一个专门用于学习的Web演练平台,人们......
  • Linux 搭建FTP服务器
    介绍本章主要介绍在Linux中搭建FTP服务器的过程,需要掌握的要点是配置文件的合理配置。  知识点在linux中使用的FTP是vsftpFTP可以有三种登入方式分别是:匿名登录方式:不需要用户密码本地用户登入:使用本地用户和密码登入虚拟用户方式:也是使用用户和密码登入,但是该用户......
  • PHP入门-搭建运行环境
    在系统装好后,推荐将电脑的命名一个言简意赅的短小名称,这样在Linuxshell或Windows命令行下,看着更舒服,特别是输入的内容较长时,效果会更明显。最近被安排接手PHP项目,由于没接触过,所以做个记录整理,便于以后查看。不管做什么开发,搭建环境是第一步。1. XMAPP 是Apache+MySQL+PHP+PE......
  • Redis主从架构环境搭建(一主二从 + 3个sentinel)
    安装RedisServersudoadd-apt-repositoryppa:redislabs/redissudoaptupdatesudoaptinstallredis-serverredis-cli-h127.0.0.1-p6379pingsudosystemctlrestartredis-serverss-an|grep6379redis-server-vRedisserverv=7.0.12sha=00000000:0malloc=jem......
  • 从0开始搭建SQL Server AlwaysOn
    从0开始搭建SQLServerAlwaysOn   第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnblogs.com/lyhabc/p/4682028.html第三篇http://www.cnblogs.com/lyhabc/p/4682986.html第四篇http://www.cnblogs.com/lyhabc/p/6136227.html搭建非域AlwaysOnwin2......
  • 快速搭建SpringBoot3.x项目
    写在前面上一小节中我们从0到1使用Vite搭建了一个Vue3项目,并集成了ElementPlus实现了一个简单的增删改查页面。这一篇中我们将使用IDEA快速搭建一个SpringBoot3.x的项目。一、创建项目1、File->new->project2、选择“SpringInitializr”,点击next;3、选择springboot版......
  • Golang 基础语法的使用
    1packagecustomer23import(4"encoding/json"5"fmt"6"os"7)89typecustomerstruct{10Namestring11Sexstring12Ageint13Phonestring14......
  • Java基础-环境搭建
    目录JDK介绍JDK下载JDK安装JDK环境配置JRE环境配置内容JDK介绍JDK(Java开发工具包)提供了构建所有面向Java平台的应用程序的基础。JDK包括执行各种任务的各种工具和实用程序,包括将源代码编译成字节码、打包应用程序、启动Java虚拟机(JVM)和管理Java应用程序的运......
  • centos搭建禅道
    下载禅道包:https://www.zentao.net/download/80137.html将包上传至linux中/opt目录下,可通过xftp,后解压该包,解压完成后,生成zbox文件夹3.修改端口,为了不占用服务器上默认的80和3306端口,需要修改禅道自带的apache、mysql端口/opt/zbox/zbox-ap8090-mp8091开放端口firewall-cmd-......