はじめに
皆さんはhomebrewで何かしらのパッケージをインストールしたことはありますか?インストールしたら直ぐにコマンドが使える時もあれば、インストールしたのに「command not found」と表示されてしまい直ぐに使えないこともあると思います。
少し開発をやっていた人であれば、「パッケージをインストールしたのにcommand not foundと表示されるということはパスが通ってないのでは?パスの通し方調べるかぁ〜」と思うでしょう。
しかしながら、なぜbrewでインストールしたのにパスが通っている時と通っていない時があるのでしょうか?
様々な理由があると思いますが、その一因として「keg-only」というhomebrewの仕様があります。
本記事ではkeg-onlyについて解説したいと思います。
keg-onlyとは?
homebrewの公式のFAQによると, keg-onlyとはパッケージ(keg)のみがインストールされ、インストール先にデフォルトでリンクが貼られないインストール方法のことを指していることがわかります[1]。
何でkeg-onlyのパッケージがあるのか?
パッケージをインストールする側にとっては「シンボリックリンクを貼っといてくれよ、、、」と感じてしまいますが、HomebrewのGitHubリポジトリのQ&Aには「keg-onlyかどうかをインストーラ側に強制的に指定することはあまりよろしくない」という旨のコメントがあります[2]。
Only you can decide whether you need to override the fact that a package is keg-only. If you're not sure, it's probably best not to.
それでは、なぜkeg-onlyという仕様が必要なのでしょうか?
1つ考えられる理由は, 最新バージョンのパッケージがインストールされている状態で、brewから古いバージョンの同一パッケージをインストールした際に、既存のパッケージのシンボリックリンクを上書きしないようにしてくれていることが挙げられます[3]。
keg-onlyかどうかはどうやって調べるのか?
このkeg-onlyかどうかについては、インストール時の最後に表示される文章を読めばわかります。
例えば、mysql@5.7をインストールした例では以下のように「mysql@5.7はkeg-onlyなので、/usr/localにsymlinkedされていません」と出力されます。
その直ぐ下に「mysql@5.7をPATH内で実行する場合は、echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile を実行してください。」とあるのがわかると思います。
これに従ってパッケージのリンクをPATHに通してあげることで解決できます。
mysql@5.7 is keg-only, which means it was not symlinked into /usr/local, because this is an alternate version of another formula. If you need to have mysql@5.7 first in your PATH run: echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile For compilers to find mysql@5.7 you may need to set: export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib" export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"
最後に
今回は, homebrewのkeg-onlyという仕様について解説しました。
なんとなく対処法を分かっている人は多いと思うものの、どういった時にPATHが通らないか?というインストーラの事情を知ることでより普段使うツールへの理解が深まるのではないでしょうか。