Cobra嵌套子命令实现复杂命令行工具

52 阅读2分钟

安装cobra-cli

go get github.com/spf13/cobra-cli

go install github.com/spf13/cobra-cli

go mod tidy ; go mod vendor

go install 默认路径

go env | grep PATH
GOPATH='/root/go'

find / -type f -name "cobra-cli"
/root/go/bin/cobra-cli


添加执行目录环境变量
vim /root/.bashrc 

export PATH=/root/go/bin:/usr/local/bin:$PATH

cobra-cli
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.

Usage:
  cobra-cli [command]

Available Commands:
  add         Add a command to a Cobra Application
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  init        Initialize a Cobra Application

Flags:
  -a, --author string    author name for copyright attribution (default "YOUR NAME")
      --config string    config file (default is $HOME/.cobra.yaml)
  -h, --help             help for cobra-cli
  -l, --license string   name of license for the project
      --viper            use Viper for configuration

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

cobra 初始化

`在未来管理cobra的目录执行,一般为cmd/cobra`
cobra-cli init .       
Your Cobra application is ready at
/data/app/saplat/cmd/cobra

root@hkdev3:/x/cmd/cobra# ll
total 16
drwxr-xr-x 3 root root 4096 Dec 25 23:09 ./
drwxr-xr-x 5 root root 4096 Dec 25 23:07 ../
drwxr-x--x 2 root root 4096 Dec 25 23:09 cmd/
-rw-r--r-- 1 root root    0 Dec 25 23:09 LICENSE
-rw-r--r-- 1 root root  156 Dec 25 23:09 main.go

cobra添加子命令


`在cobra目录执行`
cobra-cli add ecs

go run main.go 
Usage:
  cobra [command]

Available Commands:
  completion     Generate the autocompletion script for the specified shell
  ecs            ECS操作

image.png

添加二级子命令

ecs.go

var (
	instanceID string
	instanceType string
	regionId string
)

var ecsCmd = &cobra.Command{
	Use:   "ecs",
	Short: "ECS操作",
	Long: `ECS操作`,
	Run: func(cmd *cobra.Command, args []string) {
		// fmt.Println("ecs called")
	},
}

// 子命令
var ecsModifyInstanceSpecCmd = &cobra.Command{
    Use:   "modifyInstanceSpec",
    Short: "修改预付费机型规格;ecs modifyInstanceSpec -i -t -r=cn-hongkong",
	Long: `修改预付费机型规格;ecs modifyInstanceSpec --instanceID=  --InstanceType= --RegionId=cn-hongkong`,
    Run: func(cmd *cobra.Command, args []string) {
        

if instanceID != "" && instanceType != "" && regionId != "" {
	fmt.Println("修改预付费机型规格:", instanceID, instanceType, regionId)
	inspection.ModifyPrepayInstanceSpec(instanceID, instanceType, regionId)
}

// init增加
// 添加子命令到父命令
ecsCmd.AddCommand(ecsModifyInstanceSpecCmd)

image.png

对二级子命令添加参数

ecs.go

// init增加
// 父命令接收持久标志
	ecsModifyInstanceSpecCmd.PersistentFlags().StringVarP(&instanceID, "instanceID","i", "","实例ID")
	ecsModifyInstanceSpecCmd.PersistentFlags().StringVarP(&instanceType, "instanceType","t", "","机型规格")
	ecsModifyInstanceSpecCmd.PersistentFlags().StringVarP(&regionId,"regionId","r", "cn-hongkong", "Region")
	ecsModifyInstanceSpecCmd.MarkFlagsRequiredTogether("instanceID","instanceType")

image.png

go run main.go ecs modifyInstanceSpec -i="i-j6cdc1nz443azh1nfszf" -t="ecs.g6.8xlarge" -r="cn-hongkong"
修改预付费机型规格: i-j6cdc1nz443azh1nfszf ecs.g6.8xlarge cn-hongkong

image.png

链接

www.jianshu.com/p/1a10f727c…