命令行程序在程序开发过程中太普遍了。如何开始启动一个命令行程序的工具包和工具链也有很多。
个人最常使用的工具包是: 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 工具包的用途。更加扁平化的处理命令行之间的层级关系。