2

コブラを使用して CLI コマンド ツールを作成します。エラー処理以外はすべて問題ないようです

コマンドが誤って送信された場合(間違った引数または間違った入力)、std.outの代わりにstd.errを返すようにしたい

シナリオを簡素化するために、これを作成しました。これは私のユースケースを示しています

package main

import (
    "errors"
    "fmt"
    "os"

    "github.com/spf13/cobra"
)

var (
    RootCmd = &cobra.Command{
        Use: "myApp",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Printf("ROOT verbose = %d, args = %v\n", args)
        },
    }

    provideCmd = &cobra.Command{
        Use: "provide",
        Run: nil,
    }

    appCmd = &cobra.Command{
        Use: "apps",
        RunE: func(cmd *cobra.Command, args []string) error {
            name := args[0]
            if name != "myapp" {
                err := errors.New("app name doesnt exist")
                return err
            }
            return nil
        },
        SilenceUsage:               true,
    }


)

func init() {
    // Add the application command to app command
    provideCmd.AddCommand(appCmd)
    //  add provide command to root command
    RootCmd.AddCommand(provideCmd)
}

func main() {
    if err := RootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(-1)
    }
}

バイナリをコンパイルしてバイナリexec.Commandに対して実行すると、すべてが期待どおりに機能します。しかし、エラーシナリオをテストしたい場合は、 at ではなくmycli provide apps apps1 in に返されることを確認したいstd.errstd.out

私が実行すると、mycli provide apps myappすべてがOKになるはずです

しかし、実行するmycli provide apps myapp2と std.out ではなく std.err を取得したいのですが、ここではそうではありません...ここで何が欠けていますか?

https://play.golang.org/p/B00z4eZ7Sj-

4

1 に答える 1