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