您现在的位置是:首页 >技术交流 >Golang框架:cobra网站首页技术交流

Golang框架:cobra

瑜陀 2024-10-20 00:01:03
简介Golang框架:cobra

〇、前言

cobra 库是 golang 的一个开源第三方库,能够快速便捷的建立命令行应用程序。
比如:

ls -a
git add .
gcc a.c -o app

这些都是命令,二前面的ls、git、gcc等都是我们写的程序。如果不使用 cobra 框架进行编写这些命令,那么程序写起来是相当费劲的。

一、基本概念

cobra由三部分构成:commands,arguments 和 flags:

  • commands:表示要执行的动作。每一个 command 表示应用程序的一个动作。每个命令可以包含子命令。

  • arguments:给动作传入的参数。

  • flags:表示动作的行为。可以设置执行动作的行为。flags 包括两种:对某个命令生效和对所有命令生效。

比如:./app echo time helloword -t 4中,app 就是程序,echo 就是子命令,timeecho 的子命令,helloword 是传入的参数,-t 是则是 flags

二、一个例子

这个例子的目录结构如下:

▾ pro_test/
___▾ cmd/
______echo.go
______print.go
______times.go
______root.go
main.go

(一)root.go

package cmd

import "github.com/spf13/cobra"

var rootCmd = &cobra.Command{
	Use: "app [command]",
}

func Execute() {
	rootCmd.Execute()
}

(二)print.go

package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"strings"
)

var cmdPrint = &cobra.Command{
	Use:   "Print [string to print]",
	Short: "Print anything to the screen",
	Long: `print is for printing anything back to the screen.
For many years people have printed back to the screen.`,
	Args: cobra.MinimumNArgs(1),
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("Print: " + strings.Join(args, " "))
	},
}

func init() {
	rootCmd.AddCommand(cmdPrint)
}

(三)echo.go

package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"strings"
)

var cmdEcho = &cobra.Command{
	Use:   "echo [string to echo]",
	Short: "Echo anything to the screen",
	Long: `echo is for echoing anything back.
Echo works a lot like print, except it has a child command.`,
	Args: cobra.MinimumNArgs(1),
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("Print: " + strings.Join(args, " "))
	},
}

func init() {
	rootCmd.AddCommand(cmdEcho)
}

(四)times.go

package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"strings"
)

var echoTimes int
var cmdTimes = &cobra.Command{
	Use:   "time [# times] [string to echo]",
	Short: "Echo anything to the screen more times",
	Long: `echo things multiple times back to the user y providing
		a count and a string.`,
	Args: cobra.MinimumNArgs(1),
	Run: func(cmd *cobra.Command, args []string) {
		for i := 0; i < echoTimes; i++ {
			fmt.Println("Echo: " + strings.Join(args, " "))
		}
	},
}

func init() {
	cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input")
	cmdEcho.AddCommand(cmdTimes)
}

(五)main.go

main.go的作用就是初始化:

package main

import "projects_20/pro_1_example/cmd"

func main() {
	cmd.Execute()
}

(六)编译以及使用

键入:go build -o app ,就可以得到一个 名为app 的命令行应用程序。

cobra帮我们生成了很棒的 help 信息:

(base) ***@shenjian pro_1_example % ./app -h
Usage:
  app [command]

Available Commands:
  Print       Print anything to the screen
  completion  Generate the autocompletion script for the specified shell
  echo        Echo anything to the screen
  help        Help about any command

Flags:
  -h, --help   help for app

Use "app [command] --help" for more information about a command.

可以看到Available Commands有四个命令,试试 echo 这个命令:

(base) ***@shenjian pro_1_example % ./app echo -h
echo is for echoing anything back.
Echo works a lot like print, except it has a child command.

Usage:
  app echo [string to echo] [flags]
  app echo [command]

Available Commands:
  time        Echo anything to the screen more times

Flags:
  -h, --help   help for echo

Use "app echo [command] --help" for more information about a command.

可以看到Usage 选项有两个方法,而且里面还有一个子命令 time。看看 time 是怎么使用的:

(base) luliang@shenjian pro_1_example % ./app echo time -h
echo things multiple times back to the user y providing
                a count and a string.

Usage:
  app echo time [# times] [string to echo] [flags]

Flags:
  -h, --help        help for time
  -t, --times int   times to echo the input (default 1)

这个 Usage 就是用法,试试:

(base) ***@shenjian pro_1_example % ./app echo time helloworld -t 6
Echo: helloworld
Echo: helloworld
Echo: helloworld
Echo: helloworld
Echo: helloworld
Echo: helloworld

可以看到命令正常使用,太棒了!

三、使用标志

标志提供修饰符以控制命令的操作方式。由于标志是在不同位置定义和使用的,我们需要在外部定义一个具有正确作用域的变量,以分配要使用的标志。

全局标志:

rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "verbose output")

局部标志:

localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")

全文完,感谢阅读。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。