`ghg` で GitHub Releasesから適切な実行ファイルを統一的に取得する
tl;dr
% ghg get motemen/ghq
とかやれば、GitHub Releasesに上がった最新の実行ファイルを取得できる。
% $(ghg bin)/ghq
とかで実行可能。 $(ghg bin)
を $PATH
に追加してもよい。
% ghg get Songmu/ghch@v0.0.1
とかでバージョン指定も可能。
本文
Goで書いたツールを提供する場合、クロスビルドしたものを GitHub Releasesに上げるのが定番となっています。
なぜ、 go get
ではないのかというと go get
の場合以下のような問題があるからです。
go get
するにはGoの環境が必要- 安定版ではなく、開発中の最新をビルドしてしまう
- ビルド情報などをバイナリに埋め込めない
ただし、GitHub Releasesに上げるアーカイブのルールはまちまちであるため、それを統一的に取得する方法が無いのが困り者でした。
そこで作成したのが ghg。 ghq
や ghr
リスペクトで gh
+ 1文字命名になっています。
例えば motemen/ghq
から ghq
を取得したい場合には以下のように使います。
% ghg get motemen/ghq
fetch the GitHub release for motemen/ghq
install motemen/ghq version: v0.7.4
download https://github.com/motemen/ghq/releases/download/v0.7.4/ghq_darwin_amd64.zip
[======================================] 1.34 MB/1.34 MB
extract ghq_darwin_amd64.zip
install ghq
done!
ghg bin
がインストールディレクトリを返すので、あとは $(ghg bin)/ghq
などとすれば ghq
を実行可能です。 ghg bin
を $PATH
に追加しても良いでしょう。僕はそうしています。
仕組みとしては以下のようになっています。
- GitHub上の最新もしくは指定されたリリース情報を取得
- リリース情報内のアセットリストを舐めて、OSとARCHが含まれるようなアーカイブ(例えば ghq_darwin_amd64.zip) のURLを取得
- 2.で対象URLが見つかった場合それをダウンロードして展開
- アーカイブ内部の実行可能ファイルを
~/.ghg/bin
に配置
なので、アーカイブ名のルールさえ合っていれば、Goのツールにかぎらずお使いいただけます。
割と雑で強引な作りなのですが、何気にちゃんと動いているので皆様是非ご利用ください。