Cobra

cobra

首先需要安装本项目所依赖的基础库 Cobra,便于我们后续快速搭建 CLI 应用程序,在项目根目录执行命令如下:

$ go get -u github.com/spf13/cobra@v1.0.0
tour
├── main.go
├── go.mod
├── go.sum
├── cmd
├── internal
└── pkg

在本项目中,我们创建了入口文件 main.go,并新增了三个目录,分别是 cmd、internal 以及 pkg,并在 cmd 目录下新建 word.go 文件,用于单词格式转换的子命令 word 的设置,写入如下代码:

var wordCmd = &cobra.Command{
	Use:   "word",
	Short: "单词格式转换",
	Long:  "支持多种单词格式转换",
	Run: func(cmd *cobra.Command, args []string) {},
}

func init() {}

接下来还是在 cmd 目录下,增加 root.go 文件,作为根命令,写入如下代码:

var rootCmd = &cobra.Command{}

func Execute() error {
	return rootCmd.Execute()
}

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

最后在启动 main.go 文件中,写入如下运行代码:

func main() {
	err := cmd.Execute()
	if err != nil {
		log.Fatalf("cmd.Execute err: %v", err)
	}
}

这里的 word 包负责实际的转换事宜,参阅数据类型/字符串一节。在完成了单词的各个转换方法后,我们开始编写 word 子命令,将其对应的方法集成到我们的 Command 中,打开项目下的 cmd/word.go 文件,定义目前单词所支持的转换模式枚举值,新增代码如下:

const (
	ModeUpper                      = iota + 1 // 全部转大写
	ModeLower                                 // 全部转小写
	ModeUnderscoreToUpperCamelCase            // 下划线转大写驼峰
	ModeUnderscoreToLowerCamelCase            // 下线线转小写驼峰
	ModeCamelCaseToUnderscore                 // 驼峰转下划线
)

接下来进行具体的单词子命令的设置和集成,继续新增如下代码:

var desc = strings.Join([]string{
	"该子命令支持各种单词格式转换,模式如下:",
	"1:全部转大写",
	"2:全部转小写",
	"3:下划线转大写驼峰",
	"4:下划线转小写驼峰",
	"5:驼峰转下划线",
}, "\n")

var wordCmd = &cobra.Command{
	Use:   "word",
	Short: "单词格式转换",
	Long:  desc,
	Run: func(cmd *cobra.Command, args []string) {
		var content string
		switch mode {
		case ModeUpper:
			content = word.ToUpper(str)
		case ModeLower:
			content = word.ToLower(str)
		case ModeUnderscoreToUpperCamelCase:
			content = word.UnderscoreToUpperCamelCase(str)
		case ModeUnderscoreToLowerCamelCase:
			content = word.UnderscoreToLowerCamelCase(str)
		case ModeCamelCaseToUnderscore:
			content = word.CamelCaseToUnderscore(str)
		default:
			log.Fatalf("暂不支持该转换模式,请执行 help word 查看帮助文档")
		}

		log.Printf("输出结果: %s", content)
	},
}

在上述代码中,核心在于子命令 word 的 cobra.Command 调用和设置,其一共包含如下四个常用选项,分别是:

  • Use:子命令的命令标识。
  • Short:简短说明,在 help 输出的帮助信息中展示。
  • Long:完整说明,在 help 输出的帮助信息中展示。

接下来我们根据单词转换所需的参数,分别是单词内容和转换的模式进行命令行参数的设置和初始化,继续写入如下代码:

var str string
var mode int8

func init() {
	wordCmd.Flags().StringVarP(&str, "str", "s", "", "请输入单词内容")
	wordCmd.Flags().Int8VarP(&mode, "mode", "m", 0, "请输入单词转换的模式")
}

在 VarP 系列的方法中,第一个参数为需绑定的变量、第二个参数为接收该参数的完整的命令标志,第三个参数为对应的短标识,第四个参数为默认值,第五个参数为使用说明。 在完成了单词格式转换的功能后,已经初步的拥有了一个工具了,现在我们来验证一下功能是否正常,一般我们拿到一个 CLI 应用程序,我们会先执行 help 来先查看其帮助信息,如下:

$ go run main.go help word
该子命令支持各种单词格式转换,模式如下:
1:全部转大写
2:全部转小写
3:下划线转大写驼峰
4:下划线转小写驼峰
5:驼峰转下划线

Usage:
   word [flags]

Flags:
  -h, --help         help for word
  -m, --mode int8    请输入单词转换的模式
  -s, --str string   请输入单词内容

手工验证四种单词的转换模式的功能点是否正常,如下:

$ go run main.go word -s=test -m=1
输出结果: TEST
下一页