GoでCLIツールを作成する上で様々な環境にシュッと配布できるのはご指摘のとおりだと思っています。
僕もCLI作成したのですが、いい感じに配布(+ リリース情報の自動生成)するための様々なライブラリに助けられたので知見を共有させていただきます。
僕が作成したgig
という.gitignoreを生成するコマンドではmake release
でつぎの内容が実行されます。
- タグのversionを指定(対話形式)
- 指定タグをソースコードに埋め込み
- CHANGELOG生成
- scoop用のメタデータ生成
- Github Releasesに各OS用のバイナリアップデート
- formula(homebrew用の定義ファイル)を出力(別リポジトリ管理なので生成ファイルを利用して更新します)
- リリース情報をツイート
https://github.com/toshi0607/gig#install
mac用のコマンド配布で広く利用されているので採用しました。
利用者は2コマンドでコマンドが利用できるようになります。
$ brew tap toshi0607/homebrew-gig
$ brew install gig
Homebrewの公式リポジトリに登録しない場合(しない方がバージョンアップは融通が効きます)、ユーザーはイントール元を特定するためにbrew tapコマンドで定義ファイルをダウンロードします。
そのダウンロードファイルはコマンド自体とは別リポジトリで管理します。
https://github.com/toshi0607/homebrew-gig
Chocolateyと比較し、定義ファイルが自分で管理でき利用感がHomebrewに近く、管理者権限が必要なこともないので採用しました。
JSONファイルさえあればよいので楽です。
https://github.com/toshi0607/gig/blob/master/scripts/_scoop.sh
ビルドしたバイナリはtagごとにGitHub Releaseに置くと思います。
GitHubにGoタグをつけておけば、一定期間後リリースごとにこのTwitterアカウントでも自動投稿され、世界のGopher達にプロダクトを知ってもらうきっかけになります。
https://twitter.com/RealGophersShip
自動化に当たっては色々組み合わせましたが、特にtcnksm/ghrとlaher/goxcが有用です。
この記事を参考にしました。
goxc + ghrを使って、Goで書いたツールのバイナリをGithub Releasesで配布する
使ってる人も多いと思います。
別になくてもいいですが、Songmu/ghchを使うとタグ間のコミットからよしなにCHANGELOG.mdを更新してくれるので便利です。
最新のタグを取得し、Twitterに投稿するAPIをGoとAWS Lambdaで作りました。 toshi0607/release-tweeter
リポジトリのオーナーとリポジトリを指定してポストするシンプルなAPIなので自分でホストし汎用的に活用しています。