Golang的命令行库Cobra

简介

Cobra 是 Go 的 CLI 框架。它包含一个用于创建强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。

它由 Golang 团队成员 spf13 为 hugo 创建,并被最受欢迎的 Golang 项目采用。

Cobra 官方文档 https://cobra.dev/

Cobra 推荐的项目结构

1
2
3
4
5
6
appName
    cmd
        cmd1.go
        cmd2.go
        cmd3.go
    main.go
1
2
3
4
5
6
7
8
9
package main

import (
    "{pathToYourApp}/cmd"
)

func main() {
    cmd.Execute()
}

Cobra 代码示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// root cmd
package cmd

import (
    "fmt"
    "log"

    "github.com/spf13/cobra"
)

func init() {
    rootCmd.AddCommand(addCmd, versionCmd) // 追加指令
}

var rootCmd = &cobra.Command{
    Use:   "example",
    Short: "Example is an example of cobra",
    Long:  `This is a full description of the command Example`,
    Run: func(cmd *cobra.Command, args []string) {
        // Do Stuff Here
        fmt.Println("run root cmd")
    },
}

func Execute() {
    if err := rootCmd.Execute(); err != nil {
        log.Fatalln(err)
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// Version CMD
package cmd

import (
    "fmt"

    "github.com/spf13/cobra"
)

var versionCmd = &cobra.Command{
    Use:   "version",
    Short: "Example version",
    Long:  `This is the version of example`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("V1.0.0")
    },
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Add CMD
package cmd

import (
    "fmt"
    "log"
    "strconv"

    "github.com/spf13/cobra"
)

var addCmd = &cobra.Command{
    Use:   "add",
    Short: "Add two values",
    Long:  "Get the sum of two values",
    Args:  cobra.MinimumNArgs(2), // 最少两个参数
    Run: func(cmd *cobra.Command, args []string) {
        a, err := strconv.Atoi(args[0])
        if err != nil {
            log.Fatalln(err)
        }
        b, err := strconv.Atoi(args[1])
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println(a + b)
    },
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// print name CMD
package cmd

import (
    "fmt"

    "github.com/spf13/cobra"
)

var name string // 自定义命名参数

var printCmd = &cobra.Command{
    Use:   "print",
    Short: "Print name",
    Long:  "Print custom name",
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("Custome name:", name)
    },
}

func init() {
    // 参数 名称 别名 默认值 参数说明
    printCmd.Flags().StringVarP(&name, "name", "n", "", "print name")
}