2017-11-13 12 views
0

私はを使用して、いくつかのcliを自分のアプリケーションに更新しています。私はこのコマンドを必要としたい、それはそれがそれが探している引数を見つけられない場合、アプリケーションが失敗する必要があることを意味します。コブラを使用してGo CLIでサブコマンドを実行する方法

package commands 

import (
    "github.com/spf13/cobra" 
    "errors" 
    "fmt" 
) 

var (
    Env string 
) 

var RootCmd = &cobra.Command{ 
    Use: "myapp", 
    Short: "tool", 
    Long: `tool`, 
    Run: func(cmd *cobra.Command, args []string) { 
     // Root command does nothing 
    }, 
} 

func init() { 
    RootCmd.AddCommand(Environment) 
} 

var Environment = &cobra.Command{ 
    Use: "env", 
    Short: "Specify Environment to run against", 
    Long: `Can be dev or prod`, 
    Args: func(cmd *cobra.Command, args []string) error { 
     if len(args) != 1 { 
      return errors.New("requires at least one arg") 
     } 

     if args[0] == "dev" || args[0] == "prod" { 
      return nil 
     }else { 
      return errors.New("input can only be dev or prod") 
     } 
     return fmt.Errorf("invalid env specified: %s", args[0]) 
    }, 
    PreRunE: func(cmd *cobra.Command, args []string) error { 
     if len(args) != 1 { 
      return fmt.Errorf("env is required") 
     } 
     return nil 
    }, 
    Run: func(cmd *cobra.Command, args []string) { 
     Env = args[0] 
    }, 
} 

とメインパッケージ私はENVなし./myAppとしてこれを実行した場合今、それはそれについて文句はありません

package main 

import (
    "fmt" 
    "log" 
    "os" 
    "util" 
    "commands" 
) 

func main() { 
    log.Println("Executing") 

    if err := commands.RootCmd.Execute(); err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    log.Println("Executing") 
} 

です。しかし、私がmyappの後にenvを使用すると、関数を起動してすべての検証を実行します。

+0

それが可能なサブコマンドと終了のリストが表示されるようにあなたがRootCmdから「ファイル名を指定して実行」のセクションを削除することができます。より安全な退出を伴う苦情のように機能します。 –

答えて

-1

あなたはおそらくprinting helpexiting as non-successfulにより、関数の本体は、それを処理することができます:

Run: func(cmd *cobra.Command, args []string) { 
    // Root command does nothing 
    cmd.Help() 
    os.Exit(1) 
}, 
+0

@ Adrianに返信してくれてありがとう。私はそれをやっていると思ったが、それを行うにはいくつかの旗や方法があるのだろうかと思った。将来的には多くの旗があり、それらはすべて走っているのが醜いかもしれません。 – wayfare

+0

私はあなたが何を意味するのか分かりません...あなたの引用符で囲まれたコードでフラグが使用されていないので、あなたが持っているサブコマンドの数にかかわらず、上記は一箇所( 'RootCmd.Run') 。 – Adrian

関連する問題