Goツールのクロスビルドとパッケージングのためのgoxzというツールを作った
Goツールのクロスビルドと成果物生成には個人的に長らく、goxcを愛用していましたが、その乗り換えとして、goxz
というのを作った。go + x(cross) + z(zip)でgoxz
。便利です。
https://github.com/Songmu/goxz
goxcは非常に高機能なのですが、僕がその機能の一部しか必要ないことや、goxcのメンテ自体も止まっている(とオフィシャルでも案内されている)ことが気になったので作りました。
具体的には「Goツールのクロスビルドと成果物のアーカイブ生成をパラレルにおこなう」ことしかしない。アーカイブ生成時に、リポジトリからLICENSEやREADMEを自動的にかき集めるのはやってくれます。
基本的には「設定より規約」という感じで、良い感じのデフォルトを決め打ちにして、あまり細かい設定項目などは作らない想定です。
インストール
https://github.com/Songmu/goxz/releases に生成物があります。homebrewのFormulaも用意しました。お好きな方法でインストールしてください。
% brew install Songmu/tap/goxz
% ghg get Songmu/goxz
% go get github.com/Songmu/goxz/cmd/goxz
使いかた
Goプロジェクトのリポジトリ直下で以下のようにすれば、./dist
ディレクトリ以下に生成物が配置されます。
% goxz -pv=1.0.1 -os=darwin,linux -arch=amd64 -d=dist ./cmd/mytool
% tree ./dist
dist/
├─ mytool_1.0.1_darwin_amd64.zip
└─ mytool_1.0.1_linux_amd64.tar.gz
後は、みんな大好きghr を使えば、GitHub Releasesに成果物をアップロードできます。
% ghr 1.0.1 ./dist
補足など
成果物配置ディレクトリ内の事前クリーンナップ処理はおこないませんので、ビルド前に整理するか、新規ディレクトリを指定するなどしてください。配置ディレクトリが存在しない場合の新規作成はgoxz
はおこないます。
成果物の名前に、バージョン情報を含みたくない場合は、-pv
オプションを指定しなければそうなります。
圧縮方式は、windowsとdarwinでzip、それ以外がtar.gzが標準となっていますが、-z
オプションを使うことで圧縮方式をzipに統一することができます。
Mackerelプラグインパッケージの作成に利用する
goxz
はMackerelプラグインパッケージ作成にも利用可能です。Mackerelプラグインパッケージは、ファイル名にバージョン情報を含まず、また、zipであることが期待されているため、以下のように指定すると良いでしょう。
# mackerel-plugin-hoge 配下で
% goxz -os=darwin,linux,windows -arch=amd64 -z
% tree ./goxz
goxz/
├─ mackerel-plugin-hoge_darwin_amd64.zip
├─ mackerel-plugin-hoge_linux_amd64.zip
└─ mackerel-plugin-hoge_windows_amd64.zip
後は、先にも述べたとおり、ghrを使って、GitHub Releasesにアップロードするのが簡単でしょう。
ぜひご利用ください
単純に比較するのはフェアではないですが、goxcのコードベースが8000行を超えているのに対し、goxz
はテスト込みで600行程度ですので、見通しも良いと思います。
goxz
を作るにあたって、goxcを参考にした部分もあります。特にコマンドラインオプション設計などは参考になり、改めてgoxcは良くできているな、と思ったりしました。
goxz
は既に goxz
自体のビルドに使われています。僕の身の回りのツールも徐々に乗り換えていく予定です。
Goツールの成果物をGitHub Releasesに上げるときのこれからの定番は、goxz
+ ghr
ってことで一つ。
ということで、ぜひご利用ください。機能要望やpull requestもお待ちしています。