Go 및 Cobra로 구성된 CLI 툴에 플래그를 추가하는 방법
선결 조건
이 강좌의 첫 번째 부분에서, 우리는dad 우스갯소리 명령행 프로그램을 만들었는데, 이 프로그램은 터미널에서 우리에게 무작위dad 우스갯소리를 제공한다.두 번째 부분에서는 로고 검색에 특정 용어가 포함된 아빠 우스갯소리를 어떻게 사용하는지 배울 것이다.
만약 첫 번째 강좌를 배우지 않았지만, 이 강좌를 배우고 싶다면, 첫 번째 부분에서 완성된 코드를 기점으로 사용할 수 있습니다.너는 첫 번째 강좌의 리포에서 이 점을 찾을 수 있다.
깃발 추가
명령행 도구에 익숙하면 로고의 사용을 알게 될 것입니다.로고는 사용자에게 명령 행위를 수정하는 방법을 제공했다.이 강좌에서, 우리는
random
명령을 수정하여, 특정한 term
을 포함하는 무작위 농담을 검색할 수 있도록 할 것입니다.코브라에는 두 가지 깃발이 있다.
random
의 모든 하위 명령이 받아들일 수 있기를 희망하기 때문이다. term
init
파일의 cmd/random.go
함수에 지구성 표시를 추가할 수 있습니다.이름term
을 지정하고 설명했습니다.func init() {
rootCmd.AddCommand(randomCmd)
randomCmd.PersistentFlags().String("term", "", "A search term for a dad joke.")
}
이것은 명령에 로고를 추가하는 데 필요한 모든 내용입니다.우리는 이 깃발을 이용할 수 있는 몇 가지 방법이 있다.다음은 우리가 그것을 어떻게 처리할 것인가 하는 것이다.random
명령을 실행하면 검색어를 처리하는 방법을 아는 함수를 실행합니다term
명령이 아무런 표지 없이 실행되면 다른 함수를 실행합니다. 이것은 검색어에 대한 정보를 알 수 없는 랜덤 농담만 되돌려줍니다.이 함수 이름은 random
입니다. 이전 강좌검색어를 처리하는 데 필요한 함수의 초기 프레임워크를 함께 놓읍시다.
getRandomJoke()
에 이 새 함수를 추가합니다.현재, 검색어를 터미널에 인쇄하는 것만 하고 있습니다.이 기능은 다음 과정에서 구축될 예정입니다.func getRandomJokeWithTerm(jokeTerm string) {
log.Printf("You searched for a joke with the term: %v", jokeTerm)
}
현재 우리는 사용자가 cmd/random.go
로고를 사용했는지 계속 검사할 수 있다.term
의 Run
함수에 다음과 같은 검사를 추가할 수 있습니다.var randomCmd = &cobra.Command{
Use: "random",
Short: "Get a random dad joke",
Long: `This command fetches a random dadjoke from the icanhazdadjoke api`,
Run: func(cmd *cobra.Command, args []string) {
jokeTerm, _ := cmd.Flags().GetString("term")
if jokeTerm != "" {
getRandomJokeWithTerm(jokeTerm)
} else {
getRandomJoke()
}
},
}
여기서 발생하는 기본적인 상황은:randomCmd
표지에서 값을 얻었고 이를 변수term
에 저장했다jokeTerm
방법을 실행하고 jokeTerm
값을 전달합니다getRandomJokeWithTerm
가 비어 있으면 우리는 jokeTerm
만 실행하면 무작위 우스갯소리를 얻을 수 있다.마찬가지로, 이것은 우리가 이전 문장에서 만든 함수입니다.jokeTerm
로고도 있고 getRandomJoke
로고도 있습니다.# random command without the flag
go run main.go random
# random command with the term flag
go run main.go random --term=hipster
이해 반응
알림으로, 우리는 icanhazdadjoke API 를 사용하여 모든 우스갯소리 데이터를 얻고 있습니다.만약 우리가 API 문서를 한 번 보면, 우리가 요청에 검색어를 전달할 수 있다는 것을 발견할 수 있을 것이다
터미널에서 예제 curl 명령을 실행할 수 있습니다.
curl -H "Accept: application/json" "https://icanhazdadjoke.com/search?term=hipster"
코드에서 JSON 응답을 구조로 표시할 수 있습니다.type SearchResult struct {
Results json.RawMessage `json:"results"`
SearchTerm string `json:"search_term"`
Status int `json:"status"`
TotalJokes int `json:"total_jokes"`
}
검색어를 사용하여 데이터 가져오기
이제 우리는 처리할 데이터에 대해 더 잘 이해했고, 다음에 데이터를 얻는 방법을 만들 것이다.
먼저 뼈대를 생성하는 방법이 필요합니다.우선, 우리는 단지 하나의 검색어를 전달할 수 있기를 희망할 뿐, 우리는 그것을 API 호출에 전달할 수 있다.
func getJokeDataWithTerm(jokeTerm string) {
}
이전 글에서 우리는 우스갯소리 데이터를 얻는 데 도움을 주는 방법을 만들었다.우리는 심지어 창조적으로 term
라고 부른다.이 메서드는 APIgetJokeData()
를 고유 매개변수로 사용합니다.새로 생성된url
함수의 바디에 다음 행을 추가할 수 있습니다.func getJokeDataWithTerm(jokeTerm string) {
url := fmt.Sprintf("https://icanhazdadjoke.com/search?term=%s", jokeTerm)
responseBytes := getJokeData(url)
}
그리고 우리는 getJokeDataWithTerm
구조의 형상에 따라 해조를 되돌려야 한다responseBytes
func getJokeDataWithTerm(jokeTerm string) {
url := fmt.Sprintf("https://icanhazdadjoke.com/search?term=%s", jokeTerm)
responseBytes := getJokeData(url)
jokeListRaw := SearchResult{}
if err := json.Unmarshal(responseBytes, &jokeListRaw); err != nil {
log.Printf("Could not unmarshal reponseBytes. %v", err)
}
}
SearchResult{}
를 해체한 후에 우리는 responseBytes
asResults
를 얻었다.우리는 json.RawMessage
의 형상에 따라 이 원시 JSON을 해체해야 한다. 이것은 우리가 첫 번째 문장에서 만든 구조이다.우리
Joke{}
는 우스갯소리가 한 개만 포함된 것이 아닐 수도 있다.우리는 모든 우스갯소리를 Results
[]Joke{}
에 저장할 수 있다.func getJokeDataWithTerm(jokeTerm string) {
url := fmt.Sprintf("https://icanhazdadjoke.com/search?term=%s", jokeTerm)
responseBytes := getJokeData(url)
jokeListRaw := SearchResult{}
if err := json.Unmarshal(responseBytes, &jokeListRaw); err != nil {
log.Printf("Could not unmarshal reponseBytes. %v", err)
}
jokes := []Joke{}
if err := json.Unmarshal(jokeListRaw.Results, &jokes); err != nil {
log.Printf("Could not unmarshal reponseBytes. %v", err)
}
}
다음은 이 방법으로 처리된 모든 우스갯소리를 되돌려 드리겠습니다.우리는 또 우리가 얼마나 많은 농담을 받았는지 알고 싶다.함수를 업데이트하여 두 값을 반환할 수 있습니다.func getJokeDataWithTerm(jokeTerm string) (totalJokes int, jokeList []Joke) {
url := fmt.Sprintf("https://icanhazdadjoke.com/search?term=%s", jokeTerm)
responseBytes := getJokeData(url)
jokeListRaw := SearchResult{}
if err := json.Unmarshal(responseBytes, &jokeListRaw); err != nil {
log.Printf("Could not unmarshal reponseBytes. %v", err)
}
jokes := []Joke{}
if err := json.Unmarshal(jokeListRaw.Results, &jokes); err != nil {
log.Printf("Could not unmarshal reponseBytes. %v", err)
}
return jokeListRaw.TotalJokes, jokes
}
현재 우리의 Joke{}
함수는 이미 충실해서 우리는 getJokeDataWithTerm
함수에서 그것을 사용할 수 있다.다음을 바꿉니다.func getRandomJokeWithTerm(jokeTerm string) {
_, results := getJokeDataWithTerm(jokeTerm)
fmt.Println(results)
}
현재 우리는 밑줄 (getRandomJokeWithTerm
을 사용하여 totalJoke
값을 버린다.우리가 이렇게 하는 것은 단지 시범을 보이기 위해서일 뿐이니 걱정하지 마라. 우리는 다음 절에서 그것을 사용할 것이다.무작위 검색 결과
만약 우리가 지금 터미널에 들어가서 명령을 테스트한다면, 우리는 모든 검색 결과를 끊임없이 얻을 수 있을 것이다.
go run main.go random --term=hipster
이것은 우리가 진정으로 원하는 것이 아니다.우리는 로고가 있는 명령을 실행할 때마다 지정된 검색어를 포함하는 무작위 농담을 받을 수 있기를 바란다.우리는 하나의 함수를 도입하여 결과를 랜덤화함으로써 이 점을 실현할 수 있다.단, 우선 가방 몇 개를 가져오도록 하겠습니다.
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math/rand"
"net/http"
"time"
"github.com/spf13/cobra"
)
그런 다음 뼈대 임의 함수를 작성할 수 있습니다.func randomiseJokeList(length int, jokeList []Joke) {
}
Dell_
함수에는randomiseJokeList
- 무작위 범위length
- 임의의 데이터다음 코드 업데이트
jokeList
방법을 사용할 수 있습니다.func randomiseJokeList(length int, jokeList []Joke) {
rand.Seed(time.Now().Unix())
min := 0
max := length - 1
if length <= 0 {
err := fmt.Errorf("No jokes found with this term")
fmt.Println(err.Error())
} else {
randomNum := min + rand.Intn(max-min)
fmt.Println(jokeList[randomNum].Joke)
}
}
다음은 위 코드 세그먼트의 내용입니다.randomiseJokeList
함수가 모두 완성됨에 따라 randomiseJokeList
함수를 반환하고 업데이트할 수 있습니다.func getRandomJokeWithTerm(jokeTerm string) {
total, results := getJokeListWithTerm(jokeTerm)
randomiseJokeList(total, results)
}
만약 우리가 지금 단말기에 들어가서 우리의 로고를 테스트한다면, 우리는 특정 용어를 포함하는 무작위 아빠 농담을 얻을 수 있을 것이다.# get one random joke that contains the term "hipster"
go run main.go random --term=hipster
# get one random joke that contains the term "apple"
go run main.go random --term=apple
CLI 툴 배포
모든 사람들이 때때로 좋은 아빠의 농담을 좋아하기 때문에 나는 너의 친구가 너의 도구를 사용하고 싶어 할 것이라고 믿는다.이 도구는
getRandomJokeWithTerm
패키지로 배포할 수 있습니다.이를 위해Go
을 통해 설치(예: go get <link-to-your-public-repo
dadjoke random
# random joke with term
dadjoke random --term=hipster
결론
이 자습서에서는 임의의 명령에 플래그를 지정하기 위해 CLI 도구를 확장하는 방법을 배웠습니다.
만약 당신이 이 글을 좋아하고 더 많은 것을 원한다면 다음과 같은 내용을 고려할 수 있다.
축하해, 잘했어.끊임없이 공부하고, 끊임없이 인코딩하다.안녕히 계세요.
디프리노 / 아빠
Go 및 Cobra로 구성된 CLI 툴에 플래그를 추가합니다.동영상 튜토리얼은 Div Rhino 유튜브 채널에서 이용할 수 있다.
DADCLI 도구. 섹션 2: 플래그 추가
Reference
이 문제에 관하여(Go 및 Cobra로 구성된 CLI 툴에 플래그를 추가하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/divrhino/adding-flags-to-a-command-line-tool-built-with-go-and-cobra-34f1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)