Dart + GitHub Actions: Windows/macOS/Linux용 명령줄 도구를 GitHub 릴리스에 게시

10922 단어 githubactionsdart

동기 부여



Dart는 dart compile exe 로 단일 바이너리를 생성하기 때문에 신속하고 간편한 CLI 도구를 구축하고 동료와 공유하는 데 매우 적합합니다.

다음과 같이 조직 내부 도구가 GitHub 릴리스에 게시되면 유용할 것입니다.


안타깝게도 Dart doesn't support cross-compile 현재 바이너리를 게시하기 전에 각 플랫폼(Windows, macOS, Linux)에서 소스 코드를 컴파일해야 하지만 Golang은 크로스 컴파일을 지원하고 GoReleaser은 이미 바이너리를 쉽게 게시할 수 있도록 했습니다. 각 플랫폼.

GitHub Actions는 Windows/macOS/Linux 빌드 환경을 무료로 제공하며 Dart로 구성된 CLI 도구를 컴파일하고 게시하는 데 정말 유용할 것입니다.

이 문서에서는 GitHub 작업을 구성하는 방법을 보여줍니다.

빌드용 GitHub 작업



많은 기사에서 이미 언급했듯이 Dart 코드를 컴파일하는 데 4단계만 필요합니다.

- uses: actions/checkout@v2
- uses: dart-lang/setup-dart@v1
- run: dart pub get
- run: dart compile exe bin/mycli.dart -o mycli


한 가지 고려해야 할 사항은 출력 바이너리의 이름을 Windows에서는 mycli .exe로 지정하고 macOS/Linux에서는 mycli(확장자 없음)로 지정해야 한다는 것입니다.
아래와 같이 행렬을 정의하여 명명을 해결할 수 있습니다.

jobs:
  compile:
    name: dart compile exe
    strategy:
      matrix:
        include:
          - runs-on: ubuntu-latest
            binary-name: mycli_linux_amd64
          - runs-on: macos-latest
            binary-name: mycli_macos_amd64
          - runs-on: windows-latest
            binary-name: mycli_windows.exe
    runs-on: ${{ matrix.runs-on }}
    steps:
      - uses: actions/checkout@v2
      - uses: dart-lang/setup-dart@v1
      - run: dart pub get
      - run: mkdir ${{ matrix.runs-on }}
      - run: dart compile exe bin/mycli.dart -o ${{ matrix.runs-on }}/${{ matrix.binary-name }}


릴리스를 위한 GitHub 작업



https://docs.github.com/en/rest/reference/releases

이 참조에 따르면 GitHub 릴리스에는 일부 바이너리를 게시하기 위한 2단계가 필요합니다.
  • 릴리스 리소스 생성
  • POST https://api.github.com/repos/{owner}/{repo}/releases

  • 릴리스에 바이너리 업로드
  • POST https://uploads.github.com/repos/{owner}/{repo}/releases/{release_id}/assets


  • 간단한 업로드를 위해 action-gh-release 사용



    action-gh-release을 사용하면 이러한 단계를 쉽게 수행할 수 있습니다.

    - uses: softprops/action-gh-release@v1
      with:
        draft: true
        files: out/*
    


    이 간단한 정의를 통해 GitHub Actions는 out/의 모든 파일을 새 초안 릴리스로 업로드합니다.

        files: |
          out/mycli_linux
          out/mycli_macos
          out/mycli_windows
    


    또한 glob 표현식 대신 개별 파일 목록에 files를 지정할 수 있습니다.

    아티팩트를 사용하여 빌드 프로세스와 릴리스 프로세스 결합





    3개의 빌드 작업은 각각 바이너리를 생성하고 릴리스 프로세스는 한 번에 모두 업로드해야 합니다. 흐름은 GitHub 아티팩트로 구현할 수 있습니다.

    name: Publish
    
    on:
      push:
        tags:
          - '[0-9]+.[0-9]+.[0-9]+'
    
    jobs:
      compile:
        name: dart compile exe
        strategy:
          matrix:
            include:
              - runs-on: ubuntu-latest
                binary-name: mycli_linux_amd64
              - runs-on: macos-latest
                binary-name: mycli_macos_amd64
              - runs-on: windows-latest
                binary-name: mycli_windows.exe
        runs-on: ${{ matrix.runs-on }}
        steps:
          - uses: actions/checkout@v2
          - uses: dart-lang/setup-dart@v1
          - run: dart pub get
          - run: mkdir ${{ matrix.runs-on }}
          - run: dart compile exe bin/mycli.dart -o ${{ matrix.runs-on }}/${{ matrix.binary-name }}
          - uses: actions/upload-artifact@v2
            with:
              name: bin-${{ matrix.runs-on }}
              path: ${{ matrix.runs-on }}
    
      release:
        needs: compile
        name: github release
        runs-on: ubuntu-latest
        steps:
          - uses: actions/download-artifact@v2
            with:
              name: bin-ubuntu-latest
              path: bin-linux
          - uses: actions/download-artifact@v2
            with:
              name: bin-macos-latest
              path: bin-macos
          - uses: actions/download-artifact@v2
            with:
              name: bin-windows-latest
              path: bin-windows
          - uses: softprops/action-gh-release@v1
            with:
              draft: true
              files: bin-*/*
    


    이는 아래와 같이 예상대로 작동합니다.



    아티팩트가 GitHub 릴리스에 성공적으로 업로드되었습니다! :)

    좋은 웹페이지 즐겨찾기