私はを使用して、いくつかの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を使用すると、関数を起動してすべての検証を実行します。
それが可能なサブコマンドと終了のリストが表示されるようにあなたがRootCmdから「ファイル名を指定して実行」のセクションを削除することができます。より安全な退出を伴う苦情のように機能します。 –