brew install 時にメッセージを表示する Homebrew Formula を作る

社内向けの内製ツールの配布に Homebrew を使っています。brew tap で社内 Formula リポジトリを追加して、brew install でインストールするという具合です。

ツールの中には、バイナリが社内ネットワーク内のサーバに置かれているものもあり、そのツールを brew install する際には社内 VPN に接続しておく必要があります。 (VPN 未接続の状態では brew が内部で叩いている curl 実行時にコケる)

  • 利用者全員が上記のバイナリ置き場に関して事情を知っているわけではない
  • VPN に繋ぐよう README に書いたところできちんと読んでくれるか怪しい
    • ドキュメント嫁で済むなら問い合わせしたくない/されたくないが…

Formula 自体は Ruby スクリプトなので、 brew install 時に「VPNに接続してね」というメッセージを表示させることができるのではないかなと思い調べてみました。


はじめは、 Homebrew が内部で使用しているメソッドを上書きすれば実現できそうだなと思い、CurlDownloadStrategyfetch メソッドを上書こうとしていましたが、ドキュメントをよく読んでみると DownloadStrategy をカスタマイズし使用する方法が用意されているようでした。

https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md#specifying-the-download-strategy-explicitly

今回の要件は、Homebrew が提供する CurlDownloadStrategy を継承し独自の Strategy を作り、 fetch メソッドをオーバーライドすることで実現できました。

VPN 接続済みの状態でもメッセージが出るのは喧しいので、 rescue で例外を補足した場合にメッセージを表示するようにしてみました。

👇 実行するとこんな感じ。

## VPN 未接続時
% brew install awesome-tool
Updating Homebrew...
==> Installing awesome-tool from company/tools
==> Downloading http://example.com/awesome-tool/v1.0.0/awesome-tool-Darwin-amd64.tar.gz

curl: (6) Could not resolve host: example.com
Warning: awesome-tool のインストールは VPN に接続されている状態で実行する必要があります。
Download に失敗した場合 VPN に接続されているか確認してください。
Error: Failed to download resource "awesome-tools"
Download failed: http://example.com/awesome-tool/v1.0.0/awesome-tool-Darwin-amd64.tar.gz


## VPN 接続時
% brew install awesome-tool
==> Installing awesome-tool from company/tools
==> Downloading http://example.com/awesome-tool/v1.0.0/awesome-tool-Darwin-amd64.tar.gz
######################################################################## 100.0%
🍺  /usr/local/Cellar/awesome-tools/v1.0.0: 3 files, 10.7MB, built in 2 seconds

comments powered by Disqus