Node.js(io.js) & npmをアンインストールしてHomebrewとnvmで管理する

f:id:syonx:20150510202434p:plain

パッケージ版からインストールした Node.js / io.js / npm をいったんアンインストールして、Homebrew による管理に移行しようとしたらつまづいたので nvm を導入した話です。

Uninstall npm

sudo npm uninstall npm -g

npm からアンインストールしないとenv: node: No such file or directoryと言われる。

Uninstall Node.js

#シェルスクリプトの途中でパスワードを聞かれるのを防ぐ
sudo echo
Password:
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*

$ brew doctorをやってみたら警告が出てきたので対処

Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected header files:
    /usr/local/include/node/android-ifaddrs.h
    /usr/local/include/node/ares.h
    /usr/local/include/node/ares_version.h
    /usr/local/include/node/libplatform/libplatform.h
    /usr/local/include/node/nameser.h
    /usr/local/include/node/node.h

/usr/local/include/node/を削除

rm -r /usr/local/include/node/

Uninstall io.js

sudo rm /usr/local/bin/node
sudo rm /usr/local/bin/iojs

pkg で入れたものを消す。参考: f:id:syonx:20150510174015p:plain

本題の端的な手順説明

Homebrewの点検

$ brew doctor
Your system is ready to brew.

Homebrew を使って nvm をインストール

$ brew install nvm
$ mkdir ~/.nvm
$ cp $(brew --prefix nvm)/nvm-exec ~/.nvm/

zshを使っているので .zshrc に以下を追記

export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

.zshrc を再読み込み

$ source .zshrc

nvm を使って io.js をインストール

$ nvm install iojs
Now using io.js v2.0.1 (npm v2.9.0)

$ nvm current
iojs-v2.0.1

$ iojs -v
v2.0.1

$ node -v
v2.0.1

$ npm -v
2.9.0

以下、そこに至るまでの経緯

Install with Homebrew (注意: 途中で断念します)

Homebrew の点検

$ brew doctor
Warning: Your Homebrew is outdated.
You haven't updated for at least 24 hours. This is a long time in brewland!
To update Homebrew, run `brew update`.

Homebrew 自体を更新

$ brew update
$ brew doctor
Your system is ready to brew.

io.js (+ npm) をインストール

$ brew install iojs

警告が出た。

==> Downloading https://homebrew.bintray.com/bottles/iojs-2.0.1.yosemite.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/iojs-2.0.1.yosemite.bottle.tar.gz
==> Pouring iojs-2.0.1.yosemite.bottle.tar.gz
==> Caveats
iojs was installed without npm.

iojs currently requires a patched npm (i.e. not the npm installed by node).

This formula is keg-only, which means it was not symlinked into /usr/local.

iojs conflicts with node (which is currently more established)

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/iojs/lib
    CPPFLAGS: -I/usr/local/opt/iojs/include

==> Summary
🍺  /usr/local/Cellar/iojs/2.0.1: 134 files, 13M

node との衝突が想定されるので、それに配慮していますという警告。
しかし LDFLAGS とかわからない。調べたら Makefile の何からしい。Makefile のことはよくわからない。新参にキビシイ…

救世主あらわる blog.chrisyip.im

$ brew link iojs
Warning: iojs is keg-only and must be linked with --force
Note that doing so can interfere with building software.

iojs は keg-only (keg: 小さい樽・Homebrew: 自家醸造) つまりダウンロードだけしてパスを通していないので--forceを指定して意図的に link してね、という話。

$ brew link iojs --force
Linking /usr/local/Cellar/iojs/2.0.1...
Error: Could not symlink share/man/man1/iojs.1
Target /usr/local/share/man/man1/iojs.1
already exists. You may want to remove it:
  rm '/usr/local/share/man/man1/iojs.1'

To force the link and overwrite all conflicting files:
  brew link --overwrite iojs

To list all files that would be deleted:
  brew link --overwrite --dry-run iojs

--dry-runでリハーサル。

$ brew link --overwrite --dry-run --force iojs
Would remove:
/usr/local/share/man/man1/iojs.1
/usr/local/share/systemtap/tapset/node.stp
/usr/local/lib/dtrace/node.d
$ brew link --overwrite --force iojs
Linking /usr/local/Cellar/iojs/2.0.1... 6 symlinks created
$ iojs -v
v2.0.1
$ node -v
v2.0.1
$ npm -v
zsh: command not found: npm

薄々感じていたけど… npm 入ってない。

iojs currently requires a patched npm (i.e. not the npm installed by node).
― $ brew install iojs

io.jsをアンインストールして元の状態に戻す

$ brew unlink iojs
Unlinking /usr/local/Cellar/iojs/2.0.1... 9 symlinks removed

$ brew uninstall iojs
Uninstalling /usr/local/Cellar/iojs/2.0.1... (134 files, 13M)

良い管理方法をさがす

Homebrew を使って nvm をインストールし、nvm で Node.js / io.js のバージョン管理を行うのが良さそう。npm はインストール時についてくる。

nvm のインストール

$ brew install nvm
==> Downloading https://github.com/creationix/nvm/archive/v0.25.1.tar.gz
######################################################################## 100.0%
==> Downloading https://raw.githubusercontent.com/creationix/nvm/v0.25.1/nvm-exec
######################################################################## 100.0%
==> Caveats
Add NVM's working directory to your $HOME path (if it doesn't exist):

  mkdir ~/.nvm

Copy nvm-exec to NVM's working directory

  cp $(brew --prefix nvm)/nvm-exec ~/.nvm/

Add the following to $HOME/.bashrc, $HOME/.zshrc, or your shell's
equivalent configuration file:

  export NVM_DIR=~/.nvm
  source $(brew --prefix nvm)/nvm.sh

Type `nvm help` for further information.

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/nvm/0.25.1: 6 files, 80K, built in 4 seconds

言われたとおりに実行。

mkdir ~/.nvm
cp $(brew --prefix nvm)/nvm-exec ~/.nvm/

zshを使っているので .zshrc に以下を追記

export NVM_DIR=~/.nvm
source $(brew --prefix nvm)/nvm.sh

.zshrc を再読み込み

$ source .zshrc

nvm で io.js をインストール

$ nvm install iojs
######################################################################## 100.0%
WARNING: checksums are currently disabled for io.js
Now using io.js v2.0.1 (npm v2.9.0)
$ nvm current
iojs-v2.0.1
$ iojs -v
v2.0.1
$ node -v
v2.0.1
$ npm -v
2.9.0

おわった…日が暮れている…