为什么 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
如何使用 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