命令行

命令行程序在程序开发过程中太普遍了。如何开始启动一个命令行程序的工具包和工具链也有很多。

个人最常使用的工具包是: spf13/cobra。 同时结合作者提供的 spf13/viper 包,通过 cobra 提供的命令行工具可以快速的启动一个命令行项目的脚手架代码。

cobra 工具包在处理父子命令的层级关系是这样实现的:

rootCmd.AddCommand(subCmd)
...
subCmd.AddCommand(subSubCmd)

这种父子命令的组织方式当然符合逻辑,但是如果希望更加扁平化的处理命令关系,可以通过类似文件系统的目录结构的形式来定义具体的子级命令。

/			根命令
/foo		一级命令
/foo/bar  	二级命令
...

在开发上,我希望是这样的:

仅根命令行

import (
	"fmt"

	"github.com/x-mod/cmd"
)

func main() {
	cmd.Add(
		cmd.Path("/"),
		cmd.Main(Main),
	)
	cmd.Execute()
}

func Main(c *cmd.Command, args []string) error {
	fmt.Println("my root command running ...")
	return nil
}

多级命令行:

import (
	"fmt"

	"github.com/x-mod/cmd"
)

func main() {
	cmd.Add(
		cmd.Path("/foo/bar/v1"),
		cmd.Main(V1),
	).PersistentFlags().StringP("parameter", "p", "test", "flags usage")
	cmd.Version("version string")
	cmd.Execute()
}

func V1(c *cmd.Command, args []string) error {
	fmt.Println("V1 called")
	return nil
}

在Bash中,命令行操作如下:

$: go run main.go foo bar v1
V1 called

这就是 cmd 工具包的用途。更加扁平化的处理命令行之间的层级关系。

← 证书的双向认证与自动化签发 版本控制 →

评论