GitHub Releasesから取得したコマンドを所定のパスに配置して、
一括アップグレードできるようにするコマンドを作りました。
なぜ作ったかと、仕組みについて書きます。
なぜ作ったか
インストールしたコマンドのアップグレードをするのが面倒だったのを解消したかったからです。
GitHub Releasesから取得するタイプのコマンドをインストールする時、僕は以下のようなコマンドを実行します。
cd /tmp
wget https://github.com/jiro4989/nimjson/releases/download/v1.2.8/nimjson_linux.tar.gz
tar xzf nimjson_linux.tar.gz
mkdir -p ~/bin
install -m 0755 ./nimjson_linux/bin/nimjson ~/bin/
インストールする時は特にこれで不便ありません。
ですが、コマンドをアップグレードしたくなった時に困りました。
主に以下の問題に遭遇しました。
- このコマンドどこから取得したっけ?
- どうやってインストールしたっけ?
- そもそも新しいバージョン出てるんだっけ?
この問題はGitHub Releasesから取得するコマンドが増えるほど大きくなりました
ソースコード
前述の問題を解消するためにrelma
というコマンドを作りました。
Windowsでも動作します(管理者権限が必要ですが)。
使い方
インストール方法
最初に init
で初期化して、 install
にリリース物のURLを渡してあげるだけです。
これでリリース物の圧縮ファイルを展開して $HOME/relma/bin
に実行可能ファイルのシンボリックリンクが配置されます。
relma init
relma install https://github.com/jiro4989/nimjson/releases/download/v1.2.8/nimjson_linux.tar.gz
アップグレード方法
以下の様に update
して upgrade
するだけです。
update
では最新バージョンの有無をチェックし、バージョン情報をローカルに保存します。
upgrade
を実行するとアップグレード可能なパッケージをすべてアップグレードします。
relma update
relma upgrade
インストールしたパッケージの確認方法
relma でインストールしたパッケージの一覧を確認する場合は list
を実行します。
relma list
仕組み
インストール方法
relma install
に渡したURLのファイルをローカルに落し、所定のパスに展開してシンボリックリンクを作ります。
$HOME/
relma/
bin/
command.exe # シンボリックリンク
releases/
$OWNER/
$REPO/
$VERSION/
$RELEASE_FILE.tar.gz
assets/
command.exe # 実体
リリースファイルの展開後のディレクトリ構造にはある程度パターンがあります。
大体は以下の 3 パターンのいずれかだろう、と考えました。
これらの展開後のディレクトリ構造を判別して実行可能ファイルのパスを特定し、 $HOME/relma/bin
配下にシンボリックリンクを作成します。
release_v1.0.0.zip/
command.exe # コマンドだけ配置されるケース
release_v1.0.0.zip/
release_v1.0.0/
command.exe # 圧縮ファイル名のディレクトリ配下に
# コマンドが配置されるケース
release_v1.0.0.zip/
release_v1.0.0/
bin/
command.exe # 圧縮ファイル名のディレクトリ配下に
# bin ディレクトリが配置され、
# その下にコマンドが配置されるケース
アップグレード時のインストールURLの特定方法
GitHub Releasesで公開されているコマンドの多くは、リリース手順を自動化されています。
ローカルで手動で叩くコマンドか、あるいはCIからか、手段は違えど大なり小なり自動化されている場合が多いです。
また、リリースファイルの命名も、リポジトリごとに違えど、概ね命名が決まっていて、「リリースファイル名に含まれるバージョン番号だけが異なる」という点で共通点があります。
よって、 relma install
に指定したURLのバージョン番号をリリースのタグ番号で差し替えれば、次のバージョンのリリースファイルを取得するURLが特定できるのでは、と考えました。
https://github.com/jiro4989/nimjson/releases/download/${VERSION}/nimjson_${VERSION}_linux.tar.gz
しかし、開発者が毎回手動でリリースファイルを作っていて、命名が不規則だったり、タグとバージョン番号が不一致になるケースもあると思います
これはサポート外としました。
あらゆるリポジトリをサポートするつもりはないですし、命名が不規則なのはリポジトリのオーナーの管理の問題と考えます。
まとめ
- relma コマンドの使い方を説明しました
- relma コマンドの仕組みを説明しました
コマンド管理に立てば幸いです。
以上