登录
首页 >  Golang >  Go问答

cobra 未执行 PreRun / PreRunE 钩子

来源:stackoverflow

时间:2024-03-15 17:18:27 445浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《cobra 未执行 PreRun / PreRunE 钩子》,涉及到,有需要的可以收藏一下

问题内容

我有一个 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 时的情况也是如此


正确答案


据我所知,到目前为止使用该库的情况是,在执行 prerun 挂钩之前会进行验证。由于您提到了 args:cobra.exactargs(1),验证失败导致错误。
Docs

如果您想自己处理这个问题,您应该在 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
    },

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>