普段 yarn を homebrew で管理していているのだけど、yarn が node への依存を持っているせいで、インストールしたり、更新したりする時に Node.js が homebrew で追加でインストールされることがある。けど Node.js は nodebrew で管理しているので、2重でバイナリが存在してむず痒い。何とかしたい、という話。*1 *2
作戦
- homebrew でインストールした Node.js バイナリをアンインストールする
- nodebrew でインストールした Node.js バイナリを homebrew の管理化に置く
- homebrew 側で node fomula のバージョンを固定して、
brew upgrade
でアップグレードされないようにする
1. homebrew でインストールした Node.js バイナリをアンインストールする
brew uninstall node
でアンインストールできる。ただし yarn などから依存されている関係で、そのまま実行してもアンインストールできない。--ignore-dependencies
を付けて実行する必要がある。
$ # まず homebrew でインストールしたバイナリがあることを確認して... $ brew list node /usr/local/Cellar/node/15.12.0/bin/node /usr/local/Cellar/node/15.12.0/bin/nodebrew /usr/local/Cellar/node/15.12.0/bin/npm /usr/local/Cellar/node/15.12.0/bin/npx /usr/local/Cellar/node/15.12.0/include/node/ (482 files) /usr/local/Cellar/node/15.12.0/lib/dtrace/node.d /usr/local/Cellar/node/15.12.0/lib/node_modules/ (2550 files) /usr/local/Cellar/node/15.12.0/share/doc/ (2 files) /usr/local/Cellar/node/15.12.0/share/man/man1/node.1 /usr/local/Cellar/node/15.12.0/share/systemtap/tapset/node.stp $ # アンインストール $ brew uninstall node --ignore-dependencies Uninstalling /usr/local/Cellar/node/15.12.0... (3,283 files, 56MB) $ # アンインストールされたことを確認 $ brew list node Error: No such keg: /usr/local/Cellar/node
2. nodebrew でインストールした Node.js バイナリを homebrew の管理化に置く
homebrew には brew link
という、自前ビルドしたバイナリなどを homebrew の管理化に置くためのコマンドが用意されている。
これを使うと、nodebrew でインストールした Node.js バイナリを homebrew の管理化に置くことができる。
$ # まず brew doctor して node が足りないぞと言われていることを確認 $ brew doctor ... Warning: Some installed formulae are missing dependencies. You should `brew install` the missing dependencies: brew install node Run `brew missing` for more details. $ # /usr/local/Cellar/node に nodebrew でインストールした Node.js へのシンボリックリンクを貼る $ mkdir /usr/local/Cellar/node $ ln -s ~/.nodebrew/current/ /usr/local/Cellar/node $ brew link --overwrite node $ # 再度 brew doctor して警告が出なくなったことを確認 $ brew doctor $ # homebrew から見えるバイナリの位置も確認しておく $ brew list node /usr/local/Cellar/node/current/bin/node /usr/local/Cellar/node/current/bin/nodebrew /usr/local/Cellar/node/current/bin/npm /usr/local/Cellar/node/current/bin/npx /usr/local/Cellar/node/current/include/node/ (482 files) /usr/local/Cellar/node/current/lib/dtrace/node.d /usr/local/Cellar/node/current/lib/node_modules/ (2550 files) /usr/local/Cellar/node/current/share/doc/ (2 files) /usr/local/Cellar/node/current/share/man/man1/node.1 /usr/local/Cellar/node/current/share/systemtap/tapset/node.stp
3. homebrew 側で node fomula のバージョンを固定して、brew upgrade
でアップグレードされないようにする
最後に brew upgrade
で homebrew でインストールした Node.js がアップグレードされてめちゃめちゃにならないよう、バージョンを固定するようにしておく。これは brew pin
を使うとできる。
$ brew pin node
おわり。
おまけ
実は今回紹介した手法は、以下の nvm + homebrew 向けの記事を homebrew 向けにアレンジしたものになっている。nvm の人はこの記事を見れば全く同じことが達成できるはず。
*1:正直 yarn を homebrew でインストールしなければ良いのだけど、yarn 以外でも依存関係でインストールされることがある。最近だと https://github.com/antonmedv/fx とか…
*2:ちなみに homebrew でインストールした Node.js がどの fomula から依存されているかは brew uses node と打つと分かります。