다음 CLI에 변경 로그를 추가하는 이유와 방법

8890 단어 go
CLI 애플리케이션이 좋을 수도 있지만 좋지 않을 수도 있습니다. 무엇이 좋을지 알 것입니다. 릴리스 노트가 함께 배송된 경우. 진지하게 당신이 가지고 있다는 것을 의미합니다
  • --help 도움을 구하다
  • --version 버전 확인
  • --update 업데이트 가능
  • --changelog도 추가하지 못하는 이유는 무엇입니까?

    변경 로그를 추가하는 이유는 무엇입니까?



    A. "소프트웨어의 완전한 패키지 조각"으로 자격을 부여하는 것은 CLI에 남아 있는 유일한 것이기 때문입니다.

    B. 릴리스 정보를 읽는 것만으로도 명령의 잘못된 점을 디버깅하는 데 많은 시간을 절약할 수 있습니다.



    어떻게?



    변경 로그를 포함하는 방법에 대한 기술적인 부분을 살펴보기 전에 잘 관리되는 모든 오픈 소스 프로젝트에 일반적으로 포함되는 이와 같은 샘플CHANGELOG.md 파일을 고려하십시오.

    # Changelog
    
    All notable changes to this project will be documented in this file.
    
    ## [0.4] - Nov 11, 2019
    
    ### Added
    
    - `getSubmissionDate()`, `getExitCode` new methods.
    - Official Documentation.
    
    ### Changed
    
    - Class Run `init` - Now you can pass _source code_, _input_ and _output_ to program as strings (limited to file paths in prior versions).
    
    ## [0.3] - Nov 9, 2019
    
    ### Added
    
    - Removed redundant imports
    - Added Module/Class docstrings for documentation
    - Formatted Code
    
    ## [0.2] - Oct 31, 2019
    
    ### Changed
    
    - Fix import requests problem.
    
    ## [0.1] - Oct 30, 2019
    - Initial Release
    
    


    이 형식은 keepachangelog에서 영감을 받았습니다. 이 형식을 사용하여 변경 로그 파서를 구축할 것입니다. 다음 golang 코드를 사용하여 요청된 버전의 변경 로그를 추출할 수 있습니다.

    package main
    
    import (
        "fmt"
            _ "embed"
        "os"
        "regexp"
        "strings"
    )
    
    //go:embed CHANGELOG.md
    var changelog string
    
    func Parse(match string, rem string) string {
        // remove the enclosing pattern of previous release from end of output
        temp := strings.TrimSuffix(match, rem)
        return strings.Trim(temp, "\r\n")
    }
    
    func main() {
            // take care of special chars inside verison string
        enclosingPattern := `## \[`
        // prefixing verion number 0.6 with v won't work
        ver := "0.3"
        // Every header of new version looks like this: ## [1.4.0] - Jan 12, 2069
        // regexp.MustCompile(`(?s)## \[0.6.*?## \[`)
        var re = regexp.MustCompile(`(?s)` + enclosingPattern + ver + `.*?` + enclosingPattern)
            submatchall := re.FindAllString(changelog, 1)
        if len(submatchall) == 1 {
            fmt.Println(Parse(submatchall[0], "## ["))
        } else {
            fmt.Println("No release notes found for version", ver)
            os.Exit(0)
        }
    }
    
    


    정규식은 분해할 수 있습니다.

    (?s) + <enclosingPattern> + <version-number> + .* + </enclosingPattern>
    
    


  • (?s) : 점이 줄바꿈 문자를 포함한 모든 문자와 일치하도록 합니다
  • .
  • .* : . (점)은 모든 문자를 나타내고 *는 이전 토큰
  • 의 0개 이상의 인스턴스를 지정합니다.

    다음은 샘플 출력입니다.

    ## [0.3] - Nov 9, 2019
    
    ### Added
    
    - Removed redundant imports
    - Added Module/Class docstrings for documentation
    - Formatted Code
    
    


    변경 로그와 함께 배송



    Go를 사용하면 embedding static files inside go binaries을 지원하는 Go 1.16 릴리스 이후 훨씬 쉬워졌습니다.

    위의 코드에서 이를 용이하게 하는 //go:embed 지시어에 주목하십시오. Go는 빌드 시간 동안 현재 디렉터리에 파일CHANGELOG.md을 포함합니다.

    To learn more about embedding static files in Go use go doc embed



    출력 미화



    glamour을 사용하여 마크다운 출력을 미화할 수도 있습니다.

    Run go get github.com/charmbracelet/glamour to install glamour



    위 코드 수정

    
    ...
    if len(submatchall) == 1 {
        cleanOutput := Parse(submatchall[0], "## [")
        out, _ := glamour.Render(cleanOutput, "dark")
        fmt.Print(out)
    } else {
        fmt.Println("No release notes found for version", ver)
        os.Exit(0)
    }
    ...
    
    


    모습은 다음과 같습니다.

    좋은 웹페이지 즐겨찾기