HomebrewのインストーラーをRubyからBashに書き直しました!

みなさんはHomebrewをお使いでしょうか。macOSをお使いの多くの開発者が使っていると思います。

HomebrewのインストーラーはRubyで書かれており、次のコマンドでインストールするようになっていました。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

HomebrewがRubyに依存していることは良いのですが (formulaの書きやすさはRubyならでは)、インストーラーの話になると事情が変わってきます。HomebrewのインストールコマンドはmacOSの工場出荷状態でも動く必要があります。こういうものにRubyを使っているのはリスクがあります。

Homebrewの開発メンバーもインストーラーのRuby脱出問題は議論していて、Port installer to Bashというissueも立っていたのですが、数か月経っても誰も動き出す様子がありませんでした。 一月のある日、誰もBash化をやらないなら自分がやってしまおうという気持ちになったので書き直しました。

Rubyで書かれた小さなスクリプト (400行弱) とは言え、処理が1つでも抜けては困ります。 最初に git mv でファイルを移動し、 exit を少しずつずらしながら、順番にBashに書き換えていきました。 CIがすべての分岐を網羅しているわけではないので、細かいところは手でコマンドを打ったり変数の値を指定し実行してみて分岐に入るかどうかを確認したりしながら移行しました。

レビューの打ち返しをやってからしばらく反応がなかったのですが、先日ようやくマージされて、ホームページのインストールコマンドもBashに変わりました。 新しいコマンドは以下のようになります (引き続き以前のRubyのコマンドも使うことができますがWarningが表示されます)。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

個人的な開発環境構築スクリプトBashスクリプトで書いており、RubyリスクはHomebrewをインストールするところだけだったので、これでようやくRuby依存をなくすことができました。 新しいmacOSRubyPythonが入っていなくても環境構築できそうです。 よかったですね。

Bashスクリプトを書く能力は現代となってはさほど重要ではありませんが、いざという時に役に立つこともあるので、数百行くらいなら書いちゃうぜという気持ちを持っているとお得です。 仮にBashが滅んだとしても、ログインシェル (zsh?) のスクリプトに書き直すのはRubyからBashに直すよりも簡単なはずなのですぐにできそうです。 Linuxbrewの取り込みも他の方の作業によって完了しています。 BashにしたことでLinuxインストーラーが統一されたのはめでたいですね。

おしまい!