0

我有一个cobra命令

var mycommandCmd = &cobra.Command{
    Use:   "mycommand",
    PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
        viper.BindPFlags(cmd.Flags())

和一个子命令

var mysubcommandCmd = &cobra.Command{
    Use:   "mysubcommand",
    Args:  cobra.ExactArgs(1),
    PreRun: func(cmd *cobra.Command, args []string) {
        fmt.Println("HELLO")
    },
    RunE: func(cmd *cobra.Command, args []string) error {
        viper.BindPFlags(cmd.Flags())

PreRun但是,当参数传递出现错误时,我没有看到正在执行的钩子。

在上述情况下,mysubcommand只需要一个参数,因此在没有它的情况下调用它时:

go run main.go mycommand mysubcommand

Error: accepts 1 arg(s), received 0
Usage:
  myprog mycommand mysubcommand [flags]

FWIW 我想做的是打印一个更优雅和信息丰富的消息,以防参数计数错误。

PreRunE代替使用时的情况也是一样PreRun

4

1 回答 1

0

到目前为止,据我了解与该库一起工作的是,在执行PreRun钩子之前进行了验证。既然你提到Args: cobra.ExactArgs(1)了,验证失败导致错误。
文档

如果你想自己处理这个,你应该在你的mysubcommandCmd

var mysubcommandCmd = &cobra.Command{
    Use:   "mysubcommand",
    PreRunE: func(cmd *cobra.Command, args []string) {
        if len(args) != 1 {
            return errors.New("more elegant and informative message")
        }
        fmt.Println("HELLO")
        return nil
    },
于 2022-01-20T18:33:13.363 回答