Open6

【Go】cobraを使ってみる

shoetshoet

cobraの操作

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

サブコマンドの実装

  • コマンドを更に追加する
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)
shoetshoet

エラーハンドリング

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
	},
}

shoetshoet

その他

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