Cobra는 command line interface를 효율적으로 관리하는 golang library 이다. golang에는 flag라는 내장 라이브러리가 있지만 규모가 커지면 관리하기가 힘들다는 단점이 있기 때문에 Kubernetest, Hugo 등의 대규모 Go projects에서는 cobra를 활용한다.



Cobra는 commands, argument & flag 구조로 이루어져 있다.
Commands는 actions을 의미하고, Args는 things, 그리고 Flags는 actions의 접근 제어자(modifiers)를 의미한다.

cobra를 이용하여 만든 cli는 AppName Command ARG --Flag의 구조를 가지는데, iris-cloud라는 application에 server 라는 command와 port 라는 flag를 입력하려면

iris-cloud server --port=1313

으로 쓸 수 있다.

설치

go get 으로 설치

go get -u github.com/spf13/cobra

application에 include

import "github.com/spf13/cobra"

구조

Cobra-based application은 다음과 같은 구조를 가진다.

  ▾ appName/
    ▾ cmd/
        add.go
        your.go
        commands.go
        here.go
      main.go

사용법

Cobra는 application을 생성하고, commands를 추가할 수 있는 간편한 프로그램인 Cobra Generator와 직접 cobra를 구현할 수 있는 Cobra Library를 제공한다.

Cobra Generator

참고

Cobra Library

main.go 파일과 rootCmd file에 해당하는 부분을 작성해 주어야한다.
main.go 파일은 다음과 같은 구조로 되어있고, cobra의 초기화를 담당한다.

package main

import (
  "{pathToYourApp}/cmd"
)

func main() {
  cmd.Execute()
}

rootCmd는 보통 cmd 폴더 안에 위치하며, 특별한 생성자를 요구하지 않는다.

var rootCmd = &cobra.Command{
    Use: "iris-cloud",
    Shrot: "iris-cloud is a tool to provision, manage, and monitor kubernetes clusters.",
    Run: func(cmd *cobra.Command, args []string){
        // Do Something Here
    }
}

func Execute() {
  if err := rootCmd.Execute(); err != nil {
    fmt.Fprintln(os.Stderr, err)
    os.Exit(1)
  }
}


이제 원하는 command를 담은 파일을 작성해준다.
인자로 들어온 두 수를 더하는 add command와 server를 입력했을 때 ‘server running’ 라는 메세지를 띄우는 프로그램을 각각 작성해주었다.

add.go

package cmd

import (
	"fmt"
	"strconv"

	"github.com/spf13/cobra"
)

// addCmd represents the add command
var addCmd = &cobra.Command{
	Use:   "add",
	Short: "add values passed to function",
	Long:  `Demo application to demonstrate cobra featues`,
	Run: func(cmd *cobra.Command, args []string) {
		sum := 0
		for _, args := range args {
			num, err := strconv.Atoi(args)

			if err != nil {
				fmt.Println(err)
			}
			sum = sum + num
		}
		fmt.Println("result of addition is", sum)
	},
}

func init() {
	rootCmd.AddCommand(addCmd)
}

server.go

package cmd

import (
	"fmt"

	"github.com/spf13/cobra"
)

var serverCmd = &cobra.Command{
	Use:   "server",
	Short: "server cmd",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("server running")
	},
}

func init() {
	rootCmd.AddCommand(serverCmd)
}

결과

$ go run main.go
demo app to demonstrate cobra by addition

Usage:
  demo [command]

Available Commands:
  add         add values passed to function
  help        Help about any command
  server      server cmd

Flags:
  -h, --help   help for demo

Use "demo [command] --help" for more information about a command.

$ go run main.go add 1 2
result of addition is 3

$ go run main.go server
server running