Go 및 Cobra로 구성된 CLI 툴에 플래그를 추가하는 방법

23248 단어 tutorialcligocobra
최초 출시 시점divrhino.com

선결 조건


이 강좌의 첫 번째 부분에서, 우리는dad 우스갯소리 명령행 프로그램을 만들었는데, 이 프로그램은 터미널에서 우리에게 무작위dad 우스갯소리를 제공한다.두 번째 부분에서는 로고 검색에 특정 용어가 포함된 아빠 우스갯소리를 어떻게 사용하는지 배울 것이다.
만약 첫 번째 강좌를 배우지 않았지만, 이 강좌를 배우고 싶다면, 첫 번째 부분에서 완성된 코드를 기점으로 사용할 수 있습니다.너는 첫 번째 강좌의 리포에서 이 점을 찾을 수 있다.

깃발 추가


명령행 도구에 익숙하면 로고의 사용을 알게 될 것입니다.로고는 사용자에게 명령 행위를 수정하는 방법을 제공했다.이 강좌에서, 우리는 random 명령을 수정하여, 특정한 term 을 포함하는 무작위 농담을 검색할 수 있도록 할 것입니다.
코브라에는 두 가지 깃발이 있다.
  • 영구 표지 - 명령과 모든 하위 명령에 분배할 수 있음
  • 로컬 플래그 - 특정 명령에만 할당
  • 우리의 예는 매우 작아서 이런 차이는 진정한 영향을 미치지 않을 것이다.그러나 우리는 지속적인 로고를 적용할 것이다. 왜냐하면 상상 속의 미래에 random 의 모든 하위 명령이 받아들일 수 있기를 희망하기 때문이다. terminit 파일의 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 로고를 사용했는지 계속 검사할 수 있다.termRun 함수에 다음과 같은 검사를 추가할 수 있습니다.
    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{}를 해체한 후에 우리는 responseBytesasResults를 얻었다.우리는 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)
        }
    }
    
    다음은 위 코드 세그먼트의 내용입니다.
  • 우리는 한 범위 내의 무작위 값을 얻었다
  • 만약에 우스갯소리의 수량이 0보다 작거나 같으면 우리는 사용자에게 이 용어를 사용하는 우스갯소리를 찾을 수 없다는 것을 알릴 것이다
  • 하지만 우스갯소리가 나오면 무작위로 출력
  • 새로 생성한 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: 플래그 추가

  • 텍스트 자습서: https://divrhino.com/articles/add-flags-to-command-line-tool-go-cobra/
  • 비디오 자습서:
  • View on GitHub

    좋은 웹페이지 즐겨찾기