1

如何使用本地标志在 Cobra 中使用标志

package main

import (
    "fmt"
    "github.com/spf13/cobra"
)

func main() {
    myCmd := &cobra.Command{
        Use: "myaction",
        Run: func(cmd *cobra.Command, args []string) {
            if len(args) == 1 {
                flags := cmd.Flags()
                var strTmp string
                flags.StringVarP(&strTmp, "test", "t", "", "Source directory to read from")
                fmt.Println(strTmp)
            }
        },
    }

    myCmd.Execute()
}

错误

go run main.go myaction --test="hello"
Error: unknown flag: --test
Usage:
  myaction [flags]

Flags:
  -h, --help   help for myaction
4

1 回答 1

2

该命令的Run一部分仅在Execute命令上调用后才会执行(您也可以有一个prerun-hook。)

因此,在您调用 execute 的情况下,运行时不知道该标志。我们应该在调用命令之前添加标志,Execute以使运行时知道它。

代码

package main

import (
    "fmt"

    "github.com/spf13/cobra"
)

func main() {
    var strTmp string
    myCmd := &cobra.Command{
        Use: "myaction",
        Run: func(cmd *cobra.Command, args []string) {
            if len(args) == 1 {
                fmt.Println(strTmp)
            }
        },
    }
    myCmd.Flags().StringVarP((&strTmp), "test", "t", "", "Source directory to read from")
    myCmd.Execute()
}

输出

⇒  go run main.go myaction --test "hello"
hello

但是,当您想根据条件添加标志时,还有另一种解决方案。您可以稍后设置DisableFlagParsingtrue解析它。

代码

package main

import (
    "fmt"

    "github.com/spf13/cobra"
)

func main() {
    myCmd := &cobra.Command{
        Use: "myaction",
        RunE: func(cmd *cobra.Command, args []string) error {
            if len(args) > 1 {
                flags := cmd.Flags()
                var strTmp string

                // Add the flag
                flags.StringVarP(&strTmp, "test", "t", "", "Source directory to read from")
                
                // Enable the flag parsing
                cmd.DisableFlagParsing = false

                // Parse the flags
                if err := cmd.ParseFlags(args); err != nil {
                    return err
                }

                fmt.Println(strTmp)
            }

            return nil
        },
    }

    // Disable flag parsing
    myCmd.DisableFlagParsing = true
    myCmd.Execute()
}

输出

⇒  go run main.go myaction --test "hello"
hello
于 2022-01-19T15:50:16.643 回答