如何让每个眼镜蛇命令解析自己的标志?获取初始化循环(预期,但是如何避免?)

时间:2018-11-25 13:58:41

标签: go go-cobra

我正在遵循https://github.com/spf13/cobra#flags上的指南,但是我对那里的某些内容感到困惑。

我有一些服务(REST API,电子邮件服务,事件),并且我正在尝试执行以下操作:

go run *.go rest -env DEV -p 3000

go run *.go events -env DEV -p 3001

我正在关注github页面,因此我已经这样定义了rootCmd和restCmd:

var rootCmd = &cobra.Command{
    Use: "myappname",
}

var restCmd = &cobra.Command{
    Use:   "rest",
    Short: "REST API",
    Long:  "REST API",
    Run:   runRest,
}

runRest方法中,我是否应该做类似

的操作
var env string
restCmd.Flags().StringVarP(&env, "env", "env", "", "environment")

请让我知道。

谢谢

1 个答案:

答案 0 :(得分:1)

每个子命令可以有自己的标志。您可以按照以下步骤进行操作:

package main

import (
    "fmt"
    "log"

    "github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
    Use: "app",
}

func NewCmdRest() *cobra.Command {
    var env string
    var restCmd = &cobra.Command{
        Use: "rest",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println("rest:", env)
        },
    }

    restCmd.Flags().StringVarP(&env, "env", "e", "", "environment")
    return restCmd
}

func NewCmdEvent() *cobra.Command {
    var env string
    var eventCmd = &cobra.Command{
        Use: "event",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println("event:", env)
        },
    }

    eventCmd.Flags().StringVarP(&env, "env", "e", "", "environment")
    return eventCmd
}

func init() {
    rootCmd.AddCommand(NewCmdRest())
    rootCmd.AddCommand(NewCmdEvent())
}

func main() {
    if err := rootCmd.Execute(); err != nil {
        log.Fatal(err)
    }
}