为什么 Cobra 标志在此代码中不起作用

Why is Cobra flags not working in this code

如何使用 Local flags

让标志在 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

命令的 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

但是当您想根据条件添加标志时,还有一个替代解决方案。您可以将 DisableFlagParsing 设置为 true 并稍后解析它。

代码

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