ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

Homebrew Tap の SHA256 ハッシュを簡単に更新できるようにする

自分用の Homebrew Tap を作成したい!

nekonenene.hatenablog.com

こちらの記事で作った git-branch-delete-merged-rs
Homebrewbrew install でインストールできたら楽だなあ、と思いました。

そこで、『GoReleaser で Go 製 CLI のリリースを自動化& Homebrew でインストールできるようにする』の記事の『Homebrew でインストールできるようにする』の項を参考に、
homebrew-tap というリポジトリを作って、Homebrew 用の設定を置くことにしました。

github.com

ちなみに公式の説明は、
けっこうサッパリしていてわかりにくいので、作り方を検索したり、
GitHub内で「homebrew-tap」で検索をかけて他の人の例を見てみるのがオススメです。

私はけっこう aws/homebrew-tap を何度も見て参考にしました。
https://github.com/aws/homebrew-tap

自動生成の Formula ファイルを見てみる

brew create --tap nekonenene/homebrew-tap --set-name rust-test --rust https://github.com/nekonenene/git-branch-delete-merged-rs/releases/download/v1.0.4/git-branch-delete-merged_Darwin_x86_64

のようなコマンドを打つと、
/usr/local/Homebrew/Library/Taps/nekonenene/homebrew-tap/Formula/rust-test.rb に以下のようなファイルが作られます。

# Documentation: https://docs.brew.sh/Formula-Cookbook
#                https://rubydoc.brew.sh/Formula
# PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
class RustTest < Formula
  desc ""
  homepage ""
  url "https://github.com/nekonenene/git-branch-delete-merged-rs/releases/download/v1.0.4/git-branch-delete-merged_Darwin_x86_64"
  sha256 "5dd726b01b5cb78d0f256c3ba7ee6d0139691d0d39d84525411911de00138481"
  license ""

  depends_on "rust" => :build

  def install
    # ENV.deparallelize  # if your formula fails when building in parallel
    system "cargo", "install", *std_cargo_args
  end

  test do
    # `test do` will create, run in and delete a temporary directory.
    #
    # This test will fail and we won't accept that! For Homebrew/homebrew-core
    # this will need to be a test that verifies the functionality of the
    # software. Run the test with `brew test rust-test`. Options passed
    # to `brew install` such as `--HEAD` also need to be provided to `brew test`.
    #
    # The installed folder is not in the path, so use the entire path to any
    # executables being tested: `system "#{bin}/program", "do", "something"`.
    system "false"
  end
end

ダウンロードするファイルのURLと、
そのファイルをSHA256でハッシュ化した値
を記載する必要があります。

ハッシュ値は以下のようなスクリプトで取得することができます。

curl -fL https://github.com/nekonenene/git-branch-delete-merged-rs/releases/download/v1.0.4/git-branch-delete-merged_Darwin_x86_64 | shasum -a 256

5dd726b01b5cb78d0f256c3ba7ee6d0139691d0d39d84525411911de00138481  -

しかし、各OS・CPU種類ごとにバイナリファイルを作成している場合、
それぞれに対してこのコマンドを実行するのはなかなかに億劫(おっくう)です。

SHA256ハッシュ値をカンタンに取得できるようにする

というわけで作成したのが、この update_config.rb です。

configs ディレクトリに

{
  "inputs": {
    "github_url": "https://github.com/nekonenene/git-branch-delete-merged-rs",
    "version": "v1.0.4",
    "filename_template": "git-branch-delete-merged_{os}_{cpu}"
  }
}

のようなJSONファイルを置いてから

ruby update_config.rb configs/git-branch-delete-merged.json

を実行すると、必要なバイナリファイルを見に行って、
https://github.com/nekonenene/homebrew-tap/blob/v1.0.0/configs/git-branch-delete-merged.json のように
outputs キーの中に URL と SHA256 ハッシュ値のペアを入れたJSONファイルへと更新してくれます。

外部ライブラリへの依存がないので、実行前に gem install が不要なのも便利なところです。

あとは config_provider.rb でそれをパースしたものを、
Formula/git-branch-delete-merged.rb で使うような作りになっています。*1

これによって、バージョンアップ時に Formula ファイル側を変更する必要がなくなりましたし、
新たな Formula を足すときも、既存の Formula ファイルをほぼコピペするだけで使い回せるようになりました!

もし便利に感じましたら、 https://github.com/nekonenene/homebrew-tap
update_config.rb などを、お好きにコピーしたり改変したりしてお使いください!

*1:config_provider は aws/homebrew-tap を基に作成しました