본문 바로가기
개발/Golang

Cobra를 사용하여 CLI 개발 맛보기

by 상5c 2021. 8. 1.

이 글은 Cobra Github 를 참고하여 작성했습니다.

최근에 디스코드 봇을 개발할 일이 있었는데, 명령어는 어떤 형태로 내부적으로 구현하고 실행하는 것이 좋을까?를 고민하다가 다른 사람들은 어떻게 만들었을지 궁금했습니다.  Saturday night 스터디를 통해 알게된 Cobra가 명령어와 관련된 유명한 예시라고 생각되어 사용해보고, 다른사람들의 코드를 찾아보기로 했습니다. 😀

 

Cobra와 CLI

Command line interface는 간단히 말해 터미널에 텍스트를 입력하여 명령을 실행하는 방식을 의미합니다. 예를 들면 아래와 같은 형태로 명령을 실행합니다.

  • docker start application
  • git init

다른 패키지의 도움을 받고 싶지 않다면, os.Args 에서 매개변수를 직접 받는 방법도 있습니다.

Golang에서 CLI를 만들기 위한 기본 패키지로는 flag 패키지가 있습니다. 궁금하다면 이 글을 참고합니다.

Cobra는 Golang으로 서브 커맨드 형태의 CLI를 만들 수 있도록 도와주는 패키지이며, 이 글에서는 Cobra를 사용해서 계산기의 덧셈 기능을 하는 CLI를 간단히 만들어봤습니다.

 

플래그와 서브커맨드

flag 패키지는 root command 뒤에 원하는 옵션을 전달하여 사용합니다.

  • ls -al /home/hello

sub command는 root command 입력 후 원하는 커맨드를 추가로 적는 방식으로 사용 가능합니다.

  • git init
  • git commit -m "hello world"
  • git add .

cobra는 sub command 형태를 구현하고 있습니다.

 

Cobra 설치하기

코브라는 go get 명령어를 통해 설치할 수 있습니다.

go get -u github.com/psf13/cobra/cobra
  • 설치가 완료되면 cobra 커맨드가 환경변수에 추가
  • cobra 명령어만 입력 시 기본 사용법에 대한 가이드를 볼 수 있습니다.
$ cobra Cobra is a CLI library for Go that empowers applications. This application is a tool to generate the needed files to quickly create a Cobra application. Usage: cobra [command] Available Commands: add Add a command to a Cobra Application completion generate the autocompletion script for the specified shell help Help about any command init Initialize a Cobra Application Flags: -a, --author string author name for copyright attribution (default "YOUR NAME") --config string config file (default is $HOME/.cobra.yaml) -h, --help help for cobra -l, --license string name of license for the project --viper use Viper for configuration (default true) Use "cobra [command] --help" for more information about a command.

 

커맨드 만들기

golang 개발을 위해 기본 세팅이 필요합니다.

mkdir cobra-calc
cd cobra-calc
go mod init cc
  • 폴더를 만들고, 폴더를 go module로 만드는 과정

만든 폴더에 Cobra generator를 이용하여 폴더 구조와 기본 파일을 생성해줍니다.

$ cobra init --pkg-name cc
$ cobra add plus

# ------- ls
total 14
-rw-r--r-- 1 PSO 197609 11358 Aug  1 23:22 LICENSE
drwxr-xr-x 1 PSO 197609     0 Aug  1 23:23 cmd/
-rw-r--r-- 1 PSO 197609    19 Aug  1 23:21 go.mod
-rw-r--r-- 1 PSO 197609   637 Aug  1 23:22 main.go
  • cobra init -pkg-name cc: 기본 폴더 구조와 파일을 생성
  • cobra add plus: plus 커맨드가 등록되며 cmd/plus.go 파일이 생성

cobra add plus 명령어 실행 시 cmd/plus.go 파일이 생성됩니다. Command 구조체의 Run 부분을 수정하면 커맨드가 원하는 동작을 수행하도록 할 수 있습니다.

여기서는 글의 주제에 맞기 계산기의 덧셈 기능을 구현합니다.

// ...
Run: func(cmd *cobra.Command, args []string) {
    sum := 0
    for _, v := range args {
        value, err := strconv.Atoi(v)
        if err != nil {
            fmt.Printf("convert error: not number [%s]\n", v)
            return
        }
        sum += value
    }

    fmt.Print(strings.Join(args, " + "))
    fmt.Println(" =", sum)
},
// ...
  • 매개변수를 받아 문자열을 숫자로 변환하고 식과 결과를 출력

 

만든 커맨드 설치하고 실행해보기

코드에서 사용된 외부 라이브러리를 설치하는 과정이 필요합니다.

golang에서는 modules를 사용하여 의존성을 관리합니다. 주제와는 벗어나는 내용이므로 가볍게 넘어가도록 하겠습니다. 궁금하신 분들은 Go blog의 글을 참고하거나 go modules로 검색해보시길 추천합니다.

go mod tidy
go install cc
  • go mod tidy : 코드에서 사용된 라이브러리를 설치한다.
  • go install cc : cc 패키지를 build 하고, 결과물인 exe 파일을 $GOPATH/bin/ 경로에 위치합니다.

명령어만 입력해보면 Cobra가 기본으로 생성해주는 Help가 등록된 것을 볼 수 있습니다.

서브 커맨드인 plus에 대한 help도 자동으로 생성됩니다. 텍스트만 수정하면 되므로 help를 작성하는 수고를 조금 덜 수 있습니다.

$ cc plus --help
A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.

Usage:
  cc plus [flags]

Flags:
  -h, --help   help for plus

Global Flags:
      --config string   config file (default is $HOME/.cc.yaml)

그럼 이제 진짜 커맨드를 실행해보겠습니다.

$ cc plus 12 34
# 12 + 34 = 46

 

맺음말

글또 첫 번째 글 작성을 위해 Cobra 사용법을 가볍게 알아봤습니다. 미뤄뒀던 Cobra 사용법을 글또 덕분에 알아볼 수 있었습니다. 이 글에서 사용된 코드는 여기에서 볼 수 있습니다.

 

참고자료 & 다른 사람이 만든 CLI 구경하기