Golang CLI 응용 프로그램을 만드는 Cobra 라이브러리 알아보기

오늘은 Golang에서 CLI 응용 프로그램을 만드는 Cobra 라이브러리를 알아보려 합니다.

Cobra 설치

우선 Golang의 환경을 구성하기 위해 https://golang.org/dl/ 에서 윈도우, 리눅스, 맥에서 설치 프로그램을 내려받을 수 있습니다.

맥에서 brew로 쉽게 설치할 수 있습니다.

brew install go

우분투에서도 apt로 쉽게 설치할 수 있습니다.

sudo apt-get install golang-go

go get으로 github에서 호스팅되고 있는 cobra 패키지를 설치합니다.

go get -u github.com/spf13/cobra/cobra

홈의 go 폴더에 cobra 소스코드와 패키지 파일이 생성됩니다.

예제

간단하게 플래그와 커맨드를 사용할 수 있는 예제를 만들어보려 합니다.

- main.go
	/cmd
		- root.og
		- version.go

위와 같이 폴더 구조가 되어 있으면 main.go 파일로 flags와 command를 사용할 수 있게 됩니다.

main

package main

import (
	"./cmd"
)

func main() {
	cmd.Execute()
}

우선, 메인 파일에서 root의 Execute를 실행되도록 합니다.

root

package cmd

cmd라는 패키지로 만들어서 main 함수에서 불러올 수 있게 합니다.

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
)

fmt와 os, 그리고 cobra를 가져옵니다.

func init() {
	StringVar := ""
	StringVarP := ""
	rootCmd.PersistentFlags().StringVar(&StringVar, "stringVar", "", "StringVar defines a string flag")
	rootCmd.PersistentFlags().StringVarP(&StringVarP, "stringVarP", "v", "", "like StringVar, but accepts a shorthand letter")
	rootCmd.PersistentFlags().String("String", "", "String defines a string flag")
	rootCmd.PersistentFlags().StringP("stringP", "p", "", "like String, but accepts a shorthand letter")
}

생성자로 StringVar, StringVarP, String 그리고 StringP에 대한 플래그를 만들어 보았습니다.

문자열외에도 숫자, 논리 타입에 대해서도 플래그를 설정할 수도 있습니다.

  • StringVar : 플래그 이름, 기본 값, 사용법으로 작성되며, 값을 문자열 변수로 저장할 수 있습니다.

  • StringVarP : StringVar와 유사하지만, 단축문자를 설정할 수 있습니다.

  • String : 플래그 이름, 기본 값, 사용법으로 작성할 수 있습니다.

  • StringP : String과 유사하지만, 단축문자를 설정할 수 있습니다.

var rootCmd = &cobra.Command{
	Use:   "main.go",
	Short: "A 'Hello, World!' program generally is a computer program that outputs or displays the message 'Hello, World!'.",
	Long: `A "Hello, World!" program is 
traditionally used to introduce 
novice programmers to a programming language.`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Print("hello world!")
	},
}

cobra의 Command를 통해 커맨드를 만듭니다.

기본적으로 Run에 의해서 hello world 문자열이 출력되며, help 커맨드를 통해 설명이 출력됩니다.

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

마지막으로 메인 함수에서 사용한 Execute를 구현합니다.

command

package cmd

cmd라는 패키지를 만들어서 같은 패키지로 인식할 수 있게 합니다.

import (
	"fmt"

	"github.com/spf13/cobra"
)

fmt와 cobra를 가져옵니다.

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

rootCmd에 아래의 version이라는 커맨드를 등록합니다.

var version = &cobra.Command{
	Use:   "version",
	Short: "Print the version number",
	Long:  `Long text...`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("Version v0.1")
	},
}

help로 접근하면 Available Commands에서 Use와 Short이 출력됩니다.

main.go version 라고 입력하면 Run에 작성한 코드대로 수행됩니다.

Written on July 31, 2019