docker에서도 사용되고 있는 「spf13/cobra」를 사용해 CLI를 작성해 보았다

9373 단어 5cli
이번 작성해 본 것은 신규 작성이 아니고, 과거에 투고한 「 모든 문자열과 행을 강조 표시하는 도구를 Go 언어로 만들려고했습니다. 」로 작성한, 텍스트를 하이라이트 하는 커멘드를 「 cspf13/cobra

구현에 사용한 「 cspf13/cobra 」는, CLI 작성용 패키지입니다. 이것은 "도커"등에서도 사용되고 있는 매우 편리한 패키지로 간단하게 CLI를 작성할 수 있습니다.

작성한 CLI는 지정된 문자열을 포함하는 행이나 문자열을 색칠하거나 굵은 글씨와 기울임 꼴로 만듭니다.
키스트를 보기 쉽게 하기 위한 것입니다.

지정된 문자열을 포함하는 행을 표시



행 번호를 지정하여 표시



작성한 CLI는 htps : // 기주 b. 코 m / x - 코 r / mkr에 놓여 있으므로 자유롭게 사용하십시오.

이하에서는, 작성시에 막힌 플래그의 소트나, 전회 사용한 「 urfave/cli 」보다 편하게 할 수 있는 설정 파일 관련의 구현 부분등을 소개해 갑니다.

플래그 정렬 기능 끄기



작성시 조금 곤란한 점은 플래그의 정렬 기능이 기본적으로 켜져 있다는 것입니다.
이렇게하면 플래그 그룹을 따라 표시 순서를 결정할 수 없습니다.

표시 순서를 직접 결정하려면 이 정렬 기능을 꺼야 합니다.
다음과 같이 하면 꺼질 수 있습니다.
// サブコマンドにも継承されるフラグ(グローバルフラグ)のソートを無効にする
cmd.PersistentFlags().SortFlags = false
// 親コマンドから継承されたフラグ(グローバルフラグ)のソートを無効にする
cmd.InheritedFlags().SortFlags = false
// フラグの種類を混同したソートを無効にする
cmd.Flags().SortFlags = false
cmd.Flags().SortFlags = false 이해하기 어렵다고 생각합니다만, 이하의 예를 봐 주세요.
// 継承するフラグ
cmd.PersistentFlags().StringP("C-global", "C", "", "")
cmd.PersistentFlags().StringP("B-global", "B", "", "")
cmd.PersistentFlags().StringP("A-global", "A", "", "")
// 継承しないフラグ
cmd.Flags().StringP("C-local", "c", "", "")
cmd.Flags().StringP("B-local", "b", "", "")
cmd.Flags().StringP("A-local", "a", "", "")

준비했을 때,
cmd.Flags().SortFlags = true

로 설정하면 다음과 같이 표시됩니다.

명령 도움말 메시지
Flags:
 --A-global
 --A-local
 --B-global
 --B-local
 --C-global
 --C-local

반대로
cmd.Flags().SortFlags = false

로 설정하면

명령 도움말 메시지
Flags:
 --A-global
 --B-global
 --C-global
 --A-local
 --B-local
 --C-local

와 같이 표시됩니다.cmd.Flags().SortFlags = false 를 설정하는 것으로, 플래그의 종류 (계속하는 플래그인가 어떤가 등)가 혼합하는 것을 막아줍니다.

설정 파일을 사용하여 플래그의 초기 값 사용자 정의 기능 작성



「spf13/cobra」의 README내에서도 쓰여지고 있습니다만, 설정 파일 관련의 패키지인 「spf13/viper」를 이용하는 것으로 매우 간단하게 구현할 수 있습니다.
전에 사용한 패키지라고 상당히 고전했습니다만, 이번은 준비되어 있는 설정 파일용의 패키지가 강력하기 때문에 하고 싶은 것을 편하게 실장할 수 있었습니다.
// エラー処理などは省略
func readCfgFile(cfgFile string) {
    viper.SetConfigFile(cfgFile)
    viper.ReadInConfig()    
}

이상의 코드만으로, cfgFile 내의 데이터를 읽어들여 viper 가 관리해 줍니다.
읽은 데이터는
viper.GetString("data")

등으로 읽을 수 있습니다.

명령 플래그의 초기 값을 외부 구성 파일에서 지정할 수 있도록하려면,
// viper内で管理している'data'に紐付いたデータとコマンドの'flag'フラグを紐付ける
viper.BindPFlag("data", cmd.Flags().Lookup("flag"))
data := viper.Get("data")

이렇게하면 런타임에 다음과 같이됩니다.
$ cmd
# data = 'cfgFile内で設定された値' (フラグを指定しない場合)

$ cmd --flag test-data
# data = 'test-data' (フラグを指定した場合)

이제 플래그의 초기 값을 외부 파일에서 사용자 정의할 수 있습니다.

참고로 한 사이트



명령 작성 일반
- "spf13/cobra"의 README
- "spf13/cobra"의 GoDoc
- "Golang 명령 라이브러리 cobra를 사용하여 약간 잘 구현 "

설정 파일에 관하여
- "spf13/viper"의 README
- "spf13/viper"의 GoDoc

정렬 온 오프에 관하여
- "spf13/pflag"의 GoDoc

좋은 웹페이지 즐겨찾기