前言:

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

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

TL;DR

本篇文將要介紹:

  • 以前如何打包跨平台的套件 (GOX)

  • 新的打包套件 GoReleaser
  • 如何整合到 GitHub action
    • 發行新的版本 (Release) 的時候,就直接打包好新版本
    • 並且可以自動幫你打好所有 Release Note (包含 Changelog )

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

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

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

git tag -a v0.1.0 -m "First release"
git push origin v0.1.0

是不是很方便?

可能會有的問題

第一次使用 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
GO_RELEASER_GITHUB_TOKEN
push:
    tags:
      - "*"

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

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

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

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