Open6
【Go】cobraを使ってみる

cobraをインストール
go install github.com/spf13/cobra@latest

cobraの操作
- プロジェクトの初期化
cobra-cli init
- コマンドの追加
cobra-cli add hoge

サブコマンドの実装
- コマンドを更に追加する
cobra-cli add sub
- 親コマンドに AddCommand する
sub.go
parentCmd.AddCommand(subCmd)
配下のサブコマンドに対してグローバルなフラグを設ける
- parentコマンド、sub1コマンド、sub2コマンドを追加する
cobra-cli add parent
cobra-cli add sub1
cobra-cli add sub2
- parentコマンドにsub1コマンド、sub2コマンドをaddCommandする
sub1.go
func init() {
parentCmd.AddCommand(sub1Cmd)
}
sub2.go
func init() {
parentCmd.AddCommand(sub2Cmd)
}
- sub1 コマンドと sub2 コマンドに対して--filename フラグを付ける。
- 親の parent コマンドに対して以下を行う。
parent.go
parentCmd.PersistentFlags().StringP("filename", "f", "", "filename to upload")
rootCmd.AddCommand(parentCmd)
配下のサブコマンドに対して必須なフラグを設ける
- --filename フラグを必須にする
parent.go
parentCmd.PersistentFlags().String("someflag", "default", "parent flag")
parentCmd.MarkPersistentFlagRequired("someflag")
rootCmd.AddCommand(parentCmd)

エラーハンドリング
sub.go
var subCmd = &cobra.Command{
Use: "upload [sub] [-f|--filename] <filename>",
Short: "execute something sub command",
RunE: func(cmd *cobra.Command, args []string) error {
if err != nil := cmd.Flags().GetString("filename")
if err != nil {
return fmt.Errorf("error sub command: %v", err)
}
fmt.Println("exec sub command")
return nil
},
}

その他
- コマンド実行時のタイプミスのsuggestを無効化する
rootCmd.DisableSuggestions = true

cobraでのコマンドの設計・コンセプト
以下の並びでコマンドを組み立てる。
APPNAME NOUN VERB –ADJECTIVE
コマンド名 名詞 動詞 形容詞