🕌

GitHubのReleaseページから実行バイナリをダウンロードするツールをvibe codingで作った話

に公開

作ったもの

GitHubのレポジトリにはReleaseページがあり、そこに各プラットフォーム向けのビルド済みの実行バイナリを添付していることが多くあります。毎回このページをブラウザで開いて自分のプラットフォーム用のファイルをクリックして解凍してPATHが通ったディレクトリに入れるというのを繰り返すのも面倒なので自動化するツールを作りました。

https://github.com/lucidfrontier45/grd

機能説明

https://github.com/lucidfrontier45/grd/releases

からバイナリをダウンロードするかcargo-binstallなどを使ってインストールしてください。
使い方は以下の通りです。

GitHub Release Downloader

Usage: grd.exe [OPTIONS] <REPO>

Arguments:
  <REPO>  GitHub repository (e.g., owner/repo)

Options:
  -t, --tag <TAG>                    Version to download (e.g., v1.2.3). If omitted, uses latest
  -l, --list                         List available release versions
  -d, --destination <DESTINATION>    Destination directory [default: .]
  -b, --bin-name <BIN_NAME>          Executable file name (defaults to repository name if not specified)
      --first                        Always select the first matching asset without prompting
      --exclude <EXCLUDE>            Comma-separated list of words to exclude from asset matching
  -m, --memory-limit <MEMORY_LIMIT>  Memory limit in bytes; downloads larger than this use temp files [default: 104857600]
  -h, --help                         Print help
  -V, --version                      Print version

例えばこれでOpenCodeをインストールするには次のようにします。

grd -d D:\bin anomalyco/opencode

Selected version: v1.1.25
Multiple assets found. Select one:
1. opencode-desktop-windows-x64.exe (67.1 MB)
2. opencode-desktop-windows-x64.exe.sig (420 B)
3. opencode-windows-x64-baseline.zip (49.7 MB)
4. opencode-windows-x64.zip (49.7 MB)
Enter choice (1-4):

そうすると上記のようにいくつかの選択肢が出てきますのでさらに番号を入力するとそれをダウンロードされ、zipやtar.gzを解凍して指定したディレクトリに保存されます。ダウンロードするデータは基本的にはメモリ上にそのまま書き込まれますが、-mで指定した閾値を超えるサイズのデータについては一時ファイル(tempfileを使用)が利用されます。

実装

利用言語はRustです。ほとんどOpenCodeで無料のGrok Code Fast 1を使用してvibe codingしたのでそこまで特筆することもありませんが、事前に利用するライブラリをcargo addして実装する機能にそれを利用することを明記してPlanモードで実装計画を練り、Buildモードで実際に実装させました。

  • httpクライアント: ureq
  • エラー処理: anyhow
  • コマンドライン処理: clap
  • 解凍: zip, flate2, tar
  • 一時ファイル: tempfile
  • プログレスバー: indicatif

全部で300行、関数も10つ程度と非常にコンパクトな実装です。

余談

https://nishikoh.github.io/article/github-release-install-binary/

やっぱり同じ目的のツールがすでにたくさんありますね。思いっきり車輪の再発明をしてしまいましたが、それらと比較して最もシンプルな設計になっているので初めてRustで便利ツールを開発したいという方は参考にしていただけると幸いです。

Discussion