TABLE OF CONTENTS
1. What is Cobra Framework?
Golang + Cobra(viper library가 들어있는 framework)로 나만의 CLI를 만들어보도록 하자.
이번에 만들 CLI는 Config Manager로 Config를 CRUD할 수 있는 CLI를 만들도록 하자.
Golang을 이용해서 CLI를 만드는 툴(라이브러리/프레임워크)은 다양하다. cobra, gcli, Go CLI Library, go-flags, Kingpin 등등. Cobra도 이 중 하나로 특히 Cobra는 kubectl에서 K8S 상에서 내가 원하는 동작을 하는 CLI를 만들때도 사용하는 프레임워크다.
2. Designing CLI
일단 git repo에서 해당 프로젝트를 끌어오게 되면 아래와 같이 package구조가 cmd, helper, pkg로 나뉘어 지게 된다.
일단 helper package에는 error를 handling할 수 있는 method가 들어 있는 helper.go파일이 있게 된다.
pkg package에는 main.go(여기서는 manager.go라고 둔다)가 있는데 여기에는 CLI에서 사용할 method들을 모아놓은 go file이다.
cmd package에는 root에서 사용할 root.go와 그 하위에서 사용할 update.go, list.go, delete.go와 add.go가 존재한다.
root.go는 CLI에서 사용할 Command의 가장 앞 부분에 해당하는 것으로 fun init() 부분에는 command만 입력했을때 출력되는 help 문구(help statement)가 존재한다. 그리고 fun initConfig() 부분에는 config.yml 파일을 가지고 와서 viper library로 코드 level에서 관리하는 config로 설정해두고 이것을 CRUD를 진행할 수 있게 파일을 읽어서 메모리 상에 두는 부분이 들어가 있다.
add.go는 rootCmd에 addCmd가 추가가 되어 있고 이 addCmd command가 실행됐을 때의 동작으로 입력 Argument에서 key와 value를 받아서 manager.go의 AddKeyValuePair 함수를 호출해서 저장하도록 하는 기능이 구현되어 있다.
delete.go도 동일하게 입력 Argument로 key가 들어오게 되면 manager.go의 DeleteKeyValuePair 함수를 호출해서 해당 pair를 삭제하도록 되어 있다.
update.go도 동일하게 입력 Argument로 key가 들어오게 되면 manager.go의 UpdateKeyValuePair 함수를 호출해서 해당 pair를 삭제하도록 되어 있다.
list.go는 manager.go를 통하지 않고 곧바로 viper.AllKeys()와 viper.AllSettings()로 곧바로 viper에서 관리하는 것을 뽑아온다.
그럼 이제 command에서 method를 호출하는 부분은 구현이 끝났으므로 method인 manager.go에서 기능을 구현해주도록 하자.
manager.go에서
AddKeyValuePair()는 일단 validateKeyValuePair()로 key의 길이가 0이거나 value의 길이가 0이면 fmt.println으로 오류를 출력하고, log로 에러를 찍고 만약 해당 key가 기존재한다면(findExistingKey()로 확인) UpdateKeyValuePair를 사용하라는 오류를 출력하고, log로 에러를 찍는다. 이후 writeKeyValuePair()를 실행시켜서 viper.Set()으로 Set을 만든 후 viper.WriteConfig()로 설정파일에 적어주도록 해주자.
UpdateKeyValuePair()는 viper에서 key에 매칭되는 것을 찾아서 수정해주도록 작성하고,
DeleteKeyValuePair()는 viper에서 key에 매칭되는 것을 찾아서 삭제해주도록 작성하자.
여기까지 하게 되면 소스코드는 구성이 다 끝나게 되고 이제 build를 진행하기 위해서 일단 Makefile을 작성해주자. build는 Makefile에 적혀있는대로 build가 되게 된다.
위의 Makefile을 보게되면 binary file로 build될 때 mac(darwin)과 linux로만 build가 되는 것을 볼 수가 있다.
이제 make build를 해주게 되면 build가 되어 아래와 같이 build file이 나오게 된다.
현재 macbook을 사용하고 있으니 ./con-darwin list를 수행하게 되면 현재는 아무런 데이터가 없으니 그냥 빈 array로 나오게 되고, ./con-darwin add -k “test” -v “test”로 입력하게 되면 config.yml에 정상적으로 test: test가 입력이 되게 된다.
[Reference]
1. https://github.com/spf13/cobra
GitHub - spf13/cobra: A Commander for modern Go CLI interactions
A Commander for modern Go CLI interactions. Contribute to spf13/cobra development by creating an account on GitHub.
github.com
2. https://nangman14.tistory.com/97
Go로 커맨드를 실행할 수 있는 CLI를 구현해보자 (With Cobra)
CLI(Command Line Interface)란 터미널을 통해 사용자와 컴퓨터가 상호작용하는 인터페이스를 말합니다. CLI는 그래픽을 통해 직관적으로 사용할 수 있는 GUI(Graphic User Interface)와 달리 명령줄로만 입력을
nangman14.tistory.com