おそらくはそれさえも平凡な日々

`ghg` で GitHub Releasesから適切な実行ファイルを統一的に取得する

https://github.com/Songmu/ghg

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に上げるアーカイブのルールはまちまちであるため、それを統一的に取得する方法が無いのが困り者でした。

そこで作成したのが ghgghqghr リスペクトで 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 に追加しても良いでしょう。僕はそうしています。

仕組みとしては以下のようになっています。

  1. GitHub上の最新もしくは指定されたリリース情報を取得
  2. リリース情報内のアセットリストを舐めて、OSとARCHが含まれるようなアーカイブ(例えば ghq_darwin_amd64.zip) のURLを取得
  3. 2.で対象URLが見つかった場合それをダウンロードして展開
  4. アーカイブ内部の実行可能ファイルを ~/.ghg/bin に配置

なので、アーカイブ名のルールさえ合っていれば、Goのツールにかぎらずお使いいただけます。

割と雑で強引な作りなのですが、何気にちゃんと動いているので皆様是非ご利用ください。

created at
last modified at

2016-07-06T02:40:38+0900

comments powered by Disqus