mizdra's blog

ぽよぐらみんぐ

nodebrew と homebrew の Node.js が重複しないようにする

普段 yarn を homebrew で管理していているのだけど、yarn が node への依存を持っているせいで、インストールしたり、更新したりする時に Node.js が homebrew で追加でインストールされることがある。けど Node.js は nodebrew で管理しているので、2重でバイナリが存在してむず痒い。何とかしたい、という話。*1 *2

作戦

  1. homebrew でインストールした Node.js バイナリをアンインストールする
  2. nodebrew でインストールした Node.js バイナリを homebrew の管理化に置く
  3. 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 の管理化に置くためのコマンドが用意されている。

github.com

これを使うと、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 の人はこの記事を見れば全く同じことが達成できるはず。

github.com

*1:正直 yarn を homebrew でインストールしなければ良いのだけど、yarn 以外でも依存関係でインストールされることがある。最近だと https://github.com/antonmedv/fx とか…

*2:ちなみに homebrew でインストールした Node.js がどの fomula から依存されているかは brew uses node と打つと分かります。

ポケットモンスター・ポケモン・Pokémon・は任天堂・クリーチャーズ・ゲームフリークの登録商標です.

当ブログは @mizdra 個人により運営されており, 株式会社ポケモン及びその関連会社とは一切関係ありません.