🍺

HomebrewのFormulaを作成しzsh-autocompleteをbrewコマンドで入れられるようにした

2023/03/11に公開

dotfilesを作っっている中で、自動で補完の候補が表示されるzsh-autocompleteがHomebrewでインストールできなかったので、Homebrew Formulaを作成した。

自作のTap(自分のレポジトリからインストール)でもよかったが、今回は頑張ってHomebre/homebrew-coreにプルリクを送った。

詳細は公式のFormula Cookbookを確認してください。

要件の確認

CookbookにあるBasic instructionsを確認する。
今回この中で、Acceptable FormulaeのNiche(or self-submitted) stuffにある

be maintained (i.e. the last release wasn’t ages ago, it works without patching on all Homebrew-supported OS versions and has no outstanding, unpatched security vulnerabilities)

の箇所が引っかかりました。

Homebrewでは基本的にGitHub Releasesからダウンロードを行うのですが、zsh-autocompleteではREADMEに書いてあるgit cloneのインストール方法とGitHub Releasesにあるバージョンが一年ほど違いました。
zsh-autocompleteは最近もかなり活発に開発されており、古いバージョンだとバグが多いのでzsh-autocompleteの作者さんに連絡をしました。

https://github.com/marlonrichert/zsh-autocomplete/issues/538

しかし英語が苦手なのでうまく伝わらなかったのかもしれませんが、「これがstableだから問題ないよ」と言われてしまいひとまず諦めました。

プルリクのための作業するディレクトリの準備

Cookbookには記載なく、こちらを参考に作成。
https://docs.brew.sh/How-To-Open-a-Homebrew-Pull-Request

スクリプトの作成

Cookbookにある通り、以下を実行し雛形を作成。

brew create --set-name=zsh-autocomplete https://github.com/marlonrichert/zsh-autocomplete/archive/refs/tags/22.01.21.tar.gz

その後、homebrew-coreにある似たようなツールのソースコードを参考にしながら以下のようなスクリプトを作成しました。

class ZshAutocomplete < Formula
  desc "Real-time type-ahead completion for Zsh"
  homepage "https://github.com/marlonrichert/zsh-autocomplete"
  url "https://github.com/marlonrichert/zsh-autocomplete/archive/refs/tags/22.01.21.tar.gz"
  sha256 "3e725a8f603796a87cc915d02f26736d967c828b3ec1335543991ca6cbb1b753"
  license "MIT"
  head "https://github.com/marlonrichert/zsh-autocomplete.git", branch: "main"

  depends_on "clitest" => :test
  uses_from_macos "zsh" => :test

  def install
    pkgshare.install Dir["*"] + [".clitest"]
  end

  def caveats
    <<~EOS
      Installation
      1. Add at or near the top of your .zshrc file (before any calls to compdef):
        source #{HOMEBREW_PREFIX}/share/zsh-autocomplete/zsh-autocomplete.plugin.zsh
      2. Remove any calls to compinit from your .zshrc file.
      3. If you're using Ubuntu, add to your .zshenv file:
        skip_global_compinit=1
      Then restart your shell.
      For more details, see:
        https://github.com/marlonrichert/zsh-autocomplete
    EOS
  end
  test do
    cd pkgshare do
      system "zsh", "./run-tests.zsh"
    end
  end
end
  • headを追加し、GitHubから最新バージョンをインストールできるようにした
  • インストールの箇所ではpkgshare.install Dir["*"]だとドットから始まる隠しファイルがコピーされなかったので後ろにテストで使う必要なファイルを付け加えた
  • caveatsではzshの他のツールやzsh-autocompleteのREADMEを参考に作成
  • テストはzsh-autocompleteのテストをそのまま使用したが、カレントディレクトリにzsh-autocompleteのソースコードが必要なためcdし、インストールした箇所に移動し実行した

テスト・プルリクの作成など

こちらを参考にテストを行い通ったら、プルリクを作成。

https://docs.brew.sh/How-To-Open-a-Homebrew-Pull-Request

今回作成したプルリク(人生初でとても緊張した)
https://github.com/Homebrew/homebrew-core/pull/122391
参考にした方や前後のプルリクを見ると結構コメントされていてドキドキだったが何もなくマージされた🎉。

参考資料

最初に流れを掴む時に日本語で時系列ごとに書かれていてとても分かりやすかったです。
https://zenn.dev/tasshi/scraps/a22081929444cf

Discussion