前言:

使用 Golang 來開發小工具最方便的方式,就是可以很快速將程式碼託管在 github.com 。 並且透過 Golang 的跨平台編譯的工具,可以快速打包出各種平台(Windows, Linux 跟 Mac 平台)的執行檔。

那麼有沒有方式可以直接在 github.com 發行新的版本後,直接就打包好所有執行檔變且幫你把 Changelog 都打好呢?

TL;DR

本篇文將要介紹:

以前要如何打包你的 Golang CLI ?

在以前的時候,曾經有出過一個很方便可以快速打包所有平台執行檔案的小工具。 Gox 就是一個很方便的小工具:

GOX 快速快平台打包工具(以前)

https://github.com/mitchellh/gox

$ go get github.com/mitchellh/gox
...
$ gox -h
...

就這麼簡單,就可以快速編譯跨平台的工具。 其實因為 Golang 從 1.5 之後就支援跨平台編譯。 其實跨平台編譯透過

env GOOS=linux GOARCH=arm go build -v github.com/constabulary/gb/cmd/gb

透過這個方式就可以快速的打包你的工具,所以其實後來 gox 就也比較沒人在用。

需要注意地方:

  • AMD 64 只能編譯 AMD64
  • 如果要編輯 ARM 就需要使用到 ARM 版本的處理好才可以。

關於跨平台打包(編譯)更多的文章:

關於跨平台編譯更多的詳細敘述,可以參考這篇 Dave Cheney 的文章。

GoReleaser 一個好用的打包發佈的工具

後來我也看到 https://github.com/kkdai/youtube 一起在打造的夥伴們有導入 GoReleaser 。 看了一下,發現還真的蠻好用的。

這裡簡單介紹一下, GoReleaser 有做哪些事情:

  • 幫助你一次透過多平台打包套件
  • 可以深度整合 Github 跟 Gitlab 讓你直接發佈整個產品提供下載
  • 可以幫忙整理出 ChangeLog 可以幫忙整理出 ChangeLog 可以幫忙整理出 ChangeLog (懶人福星)
  • 整合 Docker 相關功能(打包 Docker Image)

GoReleaser 的安裝方式

  • brew install goreleaser/tap/goreleaser
  • curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh

如何使用 GoReleaser

參考 GoReleaser QuickStar

  • goreleaser init 來產生 .goreleaser.yml 的樣板檔案

  • 來測試一下打包 goreleaser --snapshot --skip-publish --rm-dist

  • 設定環境變數,讓你可以跟 Github 整合 export GITHUB_TOKEN="YOUR_GH_TOKEN"

    • Github Token 產生方式,去這一頁. https://github.com/settings/tokens/new
  • 如果需要發布新版本,依照以下兩個步驟:

    • git tag -a v0.1.0 -m "First release"
      git push origin v0.1.0
      
    • goreleaser release
  • 就會在 Github release 直接產生一個 Release ,並且把 ChangeLog 都包進去

是不是很方便?

可能會有的問題

第一次使用 GoReleaser 可能會遇到以下問題:

  • 確認 Github Token 有確切的當成環境變數

  • 每一次要 Release 前,需要手動將 git tag 打好 Push

  • 沒有出現 ChangeLog?

    • 記得不要打任何 Description 在你的 release
    • 記得不要打任何 Description 在你的 release
    • 記得不要打任何 Description 在你的 release

整合進 github action

Github Action 可以讓你更方便的,更直覺的來發布你的專案。而 GoReleaser 的 Github Actions 專案只需要透過以下方式:

  • 建立一個檔案在 .github/workflows/release_project.yml (檔名可換)
  • 內容參考官方範例
  • 記得加入專案的 Secrets
    • [Settings] -> [Secrets] -> (右上角) [New repository secre]
    • 名稱: GO_RELEASER_GITHUB_TOKEN Token 就照之前申請的
  • 由於設定 yaml 檔裡面有設定是
push:
    tags:
      - "*" 

這樣就會每次有打 Tag 才會執行。

  • 接下來只要在 github 上頁上的 Release -> [Draft a new release] 就可以了。

想找一個打包好的樣板,試試看? Github Command-line Template Repo

https://github.com/kkdai/go-cli-template

相關文章:


Buy Me A Coffee

Evan

Attitude is everything