YAML command line parser - yq

    작성한 YAML 파일이 문제가 없는지 검사해 보려면 어떻게 하면 좋을까? 일단은, 작성한 yml 파일에 문법적으로 결함이 없어야 할 것이다. 그 다음으로는 실제 그 값이 의도한 대로(기록된 대로) 제대로 읽히는지 확인하는 절차가 필요할 것이다.

     

    YAML validation

    지난 포스트에서는 YAML을 JSON으로 변환시켜주는 사이트를 활용하여, 내가 작성한 YAML 파일이 제대로 의미 전달이 잘 되었는지 검사하였다면, 이미 작성된 파일들을 하나하나 JSON으로 검사하기도 곤란할 것이다. 이럴 때, 다음의 사이트를 활용하여 문법체크를 해보자.

    http://www.yamllint.com/

    앞서, 사용했던 YAML 예제는 아래와 같다.

    artist:
      artist-alias1: &MK
        name: Mika
        albums:
         - Life in Cartoon Motion
         - The Boy Who Knew Too Much
         - The Origin of Love
         - No Place in Heaven
         - My Name is Michael Holbrook  
    
      artist-alias2: &MJ
        name: Michael Jackson
        albums:
          - Off the Wall
          - Thriller
          - Bad
          - Xcape
          - Michael
          - Invincible
    
    students:
      - name: Mark
        major: Math
        age: 20
        favorites: [*MK, *MJ]
      - name: Julie
        major: Arts
        age: 23
        favorites: [*MK] 
      - name: Tommy
        major: Music
        age: 25

    이 파일을 위의 사이트에 붙여 넣어서 검증하면 다음과 같이 뜬다.

    하단에 Valid YAML! 이라고 뜬 것을 확인할 수 있다.

     

    실제 값 추출하기

    문법은 패스했다면, 실제 파서를 활용하여 내가 입력한 값이 제대로 추출가능한지도 확인하면 좋을 것이다. 물론, 애플리케이션에서 해도 되지만, 이를 커맨드라인에서 먼저 확인하고 싶을 때 사용할 수 있는 방법이라 보면 된다.

     

    yq 설치하기

    yq라는 프로그램을 설치하자. yq는 커맨드라인상에서 YAML/XML 파일을 처리할 수 있는 프로그램이며, jq의 wrapper 라 할 수 있다.

    $ brew install yq

    OSX에서 위의 명령어로 간단하게 yq를 설치하였다. 내 경우는, 위 명령어로 설치한 후 실행하니 jq도 없다고 하여, jq까지 추가로 설치해 주었다.

    $ brew install jq

    yq를 실행하면, 프로그램에 대한 간단한 설명이 다음과 같이 출력된다.

    Usage:
      yq [flags]
      yq [command]
    
    Available Commands:
      eval             Apply expression to each document in each yaml file given in sequence
      eval-all         Loads _all_ yaml documents of _all_ yaml files and runs expression once
      help             Help about any command
      shell-completion Generate completion script
    
    Flags:
      -C, --colors         force print with colors
      -e, --exit-status    set exit status if there are no matches or null or false is returned
      -h, --help           help for yq
      -I, --indent int     sets indent level for output (default 2)
      -i, --inplace        update the yaml file inplace of first yaml file given.
      -M, --no-colors      force print with no colors
      -N, --no-doc         Don't print document separators (---)
      -n, --null-input     Don't read input, simply evaluate the expression given. Useful for creating yaml docs from scratch.
      -P, --prettyPrint    pretty print, shorthand for '... style = ""'
      -j, --tojson         output as json. Set indent to 0 to print json in one line.
          --unwrapScalar   unwrap scalar, print the value with no quotes, colors or comments (default true)
      -v, --verbose        verbose mode
      -V, --version        Print version information and quit
    
    Use "yq [command] --help" for more information about a command.

     

    yq 사용하기

    기본적인 사용법은,

    $ yq eval [표현식] [yaml파일]
    $ yq e [표현식] [yaml파일]

    형식이다. 앞서 인용한 yml text를 파일로 저장하고 다음과 같이 테스트 해본다.

    • 전체 출력하기
    $ yq e  test.yml
    
    artist:
      artist-alias1: &MK
        name: Mika
        albums:
          - Life in Cartoon Motion
          - The Boy Who Knew Too Much
          - The Origin of Love
          - No Place in Heaven
          - My Name is Michael Holbrook
      artist-alias2: &MJ
        name: Michael Jackson
        albums:
          - Off the Wall
          - Thriller
          - Bad
          - Xcape
          - Michael
          - Invincible
    students:
      - name: Mark
        major: Math
        age: 20
        favorites: [*MK, *MJ]
      - name: Julie
        major: Arts
        age: 23
        favorites: [*MK]
      - name: Tommy
        major: Music
        age: 25

     

    • 특정 섹션/값만 출력하기
    $ yq e '.artist.artist-alias1' test.yml
    
    &MK
    name: Mika
    albums:
      - Life in Cartoon Motion
      - The Boy Who Knew Too Much
      - The Origin of Love
      - No Place in Heaven
      - My Name is Michael Holbrook
    
    $ yq e '.artist.artist-alias1.name' test.yml
    Mika
    
    $ yq e '.artist.artist-alias1.albums' test.yml
    - Life in Cartoon Motion
    - The Boy Who Knew Too Much
    - The Origin of Love
    - No Place in Heaven
    - My Name is Michael Holbrook

     

    • 리스트 엘리먼트 접근하기
    $ yq e '.artist.artist-alias1.albums[0]' test.yml
    Life in Cartoon Motion
    
    $ yq e '.students[1]' test.yml
    name: Julie
    major: Arts
    age: 23
    favorites: [*MK]

     

    • Alias 액세스하기
    $ yq e '.students[0].favorites' test.yml
    [*MK, *MJ]
    
    $ yq e '.students[0].favorites[0]' test.yml
    *MK
    
    $ yq e '.students[0].favorites[0].name' test.yml
    Mika
    
    $ yq e '.students[0].favorites[0].albums' test.yml
    - Life in Cartoon Motion
    - The Boy Who Knew Too Much
    - The Origin of Love
    - No Place in Heaven
    - My Name is Michael Holbrook

     

    위와 같이 yq를 사용하여 특정 값들을 읽어오는 것을 확인하였다. 즉, 애플리케이션내에서도 이와 유사한 방식으로 해당 값들을 읽을 수 있다는 것을 커맨드라인 툴로 손쉽게 검증하였다.

     

    yq로 문법 검증하기

    위에서는 yamllint.com으로 온라인 검증을 했다면, yq를 설치하고 yq를 이용하여 문법 검증을 할 수도 있다.

    $ yq e 'true' 파일명

    실행 결과 특이사항이 없으면, true를 리턴하고 문제가 있으면 에러를 리턴한다.

     

    참고

    yq의 기존 버전과 하위 버전의 차이는 아래 사이트를 참조하자.

    https://mikefarah.gitbook.io/yq/upgrading-from-v3

    댓글

    Designed by JB FACTORY