年中アイス

いろいろつらつら

homebrew tapのformulaファイルの置き場所

前回のエントリで、goreleaserとgithub actionsを使ったhomebrewのformulaファイルの自動生成と登録について書き、既存のツールを3つ移行しました。しかし、その度にpersonal access tokenを発行して、リポジトリのSecretsに登録するという作業が地味地味と面倒でした。*1

github actionsを使わずにgoreleaserをローカルで実行すれば、tokenの発行はローカルマシンの1回で済みますが、ワークフローを考えるとgithub actionsで済ませたいので、homebrew-tapリポジトリに入れるのではなく、ツール自身のリポジトリにformulaを置けないかと考えました。

結果は、リポジトリ直下にformulaファイルを置けば、brew tapbrew installで動きました。ただ、ケースバイケースな気もするので、私が試したhomebrew tap向けのformulaの置き方、以下3パターンを比較します。

  1. homebrew-tapリポジトリを作ってそこにformulaを集約する
  2. homebrew-toolnameリポジトリをツール個別に作ってツール用のformulaを入れる
  3. ツール自身のリポジトリにformulaを入れる(動かなくなりました)

homebrew-tap/tool.rb

homebrew-tapというリポジトリを作り、そこにformulaを集約します。

reiki4040/
  └ homebrew-tap/
      ├ rnzoo.rb
      ├ rnssh.rb
      └ mogura.rb

2通りのインストールコマンドがあります。

brew install reiki4040/tap/rnzoo

または

brew tap reiki4040/rnzoo
brew install reiki4040/rnzoo

でインストールすることができます。

メリット

  • brew install reiki4040/tap/rnzooのように1コマンドでインストールが可能。
  • homebrew系のリポジトリがこれ1つで済む
  • リポジトリを見れば、他のツールの存在がわかる
  • リポジトリが分かれているので、ツール側のリポジトリにhomebrew用ファイルのコミットが混ざらない

デメリット

homebrew-tool/tool.rb

もともとツール別に作っていたリポジトリ

reiki4040/
  ├ homebrew-rnzoo/
  │   └ rnzoo.rb
  │ 
  ├ homebrew-rnssh/
  │   └ rnssh.rb
  │ 
  └ homebrew-mogura/
      └ rnssh.rb

以下でインストール可能です。

brew tap reiki4040/rnzoo
brew install reiki4040/rnzoo

メリット

  • 実はあんまりないかもしれません。organization内で、homebrewの管理をリポジトリごとバラバラに行いたい場合とかがあれば。

デメリット

tool/tool.rb

※2021/04/20現在、私の環境ではこの方式は動かなくなっていました。

ツールのリポジトリに直接置く、今回試した方法です。*3

reiki4040/
  └ rnzoo/
      └ rnzoo.rb

インストールは以下のように2コマンド必須で、brew installで直接インストールはできませんでした。

brew tap reiki4040/rnzoo
brew install reiki4040/rnzoo

メリット

デメリット

  • homebrew系のコミットが混ざる(これをデメリット捉えるか次第)
  • brew tapしてからbrew installの必要がある(どうせコピペなので、そんなに負荷ではないかな)

最後に

いくつかパターンがあり、個別にhomebrew-toolリポジトリを作るのはそんなにメリットがないです。通常は、homebrew-tapリポジトリ作るのが一番無難かなと思います。ただ、github actionsを使い、secretsにtoken入れるの面倒(または不安)だなと言う場合は、ツールのリポジトリ直下に置くのもありかなと思います。この辺りは選択肢として知っておくのは良いと思います。

*1:トークンをリポジトリ間で使い回すという手もありますが避けました。

*2:他の外部サービスも同様?試してないです。

*3:試したのはrnzooではなく別のリポジトリですが、同じ流れで例示してます。