Node.jsの管理をHomebrewからnaveに移行した

[追記] 現在はnodebrewを使ってます。おすすめ。


昔HomebrewでNode.jsをインストールしたけどnaveに移行したよという話。作業ついでに調べたことのメモ。


こんな生Node.jsはいやだ!(Homebrewとかのパッケージ管理やソースから入れたときの問題点)

  • Node.jsのバージョンがもりもり上がる(これはソースから入れたときの問題)
  • 0.4系(stable)と0.5系(dev)を気軽に切り替えて試せない
  • Node.js本体とnpmの権限が違ったりして、sudoするとかしないとか面倒


Node.js本体を管理するユーティリティとしてnvmnaveっていう2つがあって機能はだいたい一緒。ただし、nvmはzshとの相性が悪いようでパッチを当てなきゃならんらしく、zsh厨としてはとりあえずnaveを選択。naveはnpmと作者が同じなので相性もいいはず(という願い)。


今回は、個人の開発環境用に全部ユーザーのホームディレクトリ以下にインストールする形にする。

1. 古いNode.jsのアンインストール

まずはHomebrewで入れた古いNode.jsのアンインストール、の前に、先にnpmのアンインストールをしておく。(npmをあとから消すのはパスの設定とかめんどくさかった)

$ sudo npm uninstall npm -g

上のコマンドだとnpmでインストール済みのモジュール群は削除されない。削除したい人は、npm lsの結果をnpm rmするか、以下のコマンドで削除できるよって公式READMEに書いてあった(怖いから試してない)。

$ npm explore npm -g -- sh scripts/clean-old.sh

次いでNode.js本体のアンインストール。

$ sudo brew uninstall node.js

あとNODE_PATHとかの環境変数を.profileとかに書いてたら消しとく。

2. naveとNode.jsのインストール

実際にはnave.shさえあればいいのだけど、手っ取り早くcloneする。

$ git clone https://github.com/isaacs/nave.git ~/.nave

nave.shにパスを通す。ここではパスの通ったディレクトリにリンクしてるけど、aliasにしてもいい。

$ ln -s ~/.nave/nave.sh ~/local/bin/nave

次にnaveコマンドでNode.js本体をインストール

$ nave use stable
$ node -v
v0.4.12

"stable"だと安定板0.4系の最新バージョン、"latest"だと0.5系の最新バージョンをインストールした上で、もろもろの環境変数を設定してくれる。もちろん"nave use 0.4.12"とか直接バージョンを指定してもいい。


実際にインストールしてから分かったのだけど、このnaveというのは各種環境変数を設定したshellを起動するシェルスクリプト。なので何回もnave useすると何層もシェルをラップするような感じになってしまう。ちょっといやな感じ。どうやらnvmの方はシェル起動ではなく現在のシェルの上で環境変数をよろしくするタイプらしいのだけど、うーん。どっちもどっちか。


ということなので、常時Node.jsを有効にするためには、nave use stableを.profileに書いておくか、.bashrc系なら以下のように書くとnave useするたびに多重起動しちゃうのを防げる。

if [ ${NAVELVL-0} -lt 1 ]; then
    nave use stable
fi

$NAVELVLはnave useを呼んだ回数、現在何層目かを記憶しているトーテム*1のようなものなので、これで判定するのが良いでしょう。

3. npmのインストール

npmは普通にインストール。

$ curl http://npmjs.org/install.sh | sh

試しにexpressをインストール。

$ npm install express -g

-gオプションを付けると、現在useしているバージョンのNode.js全体で使えるようにインストールしてくれる。逆に付けないとカレントディレクトリのnode_modulesにインストールしちゃうので、アプリ単位で必要なときに使う。

4. ディレクトリ構成の確認

そうするとだいたいこんな感じになる。

.nave/
├── installed
│   ├── 0.4.12
│   │   ├── bin
│   │   │   ├── express -> ../lib/node_modules/express/bin/express
│   │   │   ├── node
│   │   │   ├── node-waf
│   │   │   ├── node_g
│   │   │   ├── npm -> ../lib/node_modules/npm/bin/npm.js
│   │   │   ├── npm-g -> ../lib/node_modules/npm/bin/npm.js
│   │   │   └── npm_g -> ../lib/node_modules/npm/bin/npm.js
│   │   ├── include
│   │   ├── lib
│   │   │   ├── node
│   │   │   ├── node_modules
│   │   │   │   ├── express
│   │   │   │   ├── npm
│   │   │   │   └── socket.io
│   │   │   └── pkgconfig
│   │   └── share
│   └── 0.5.7
└── src
    ├── 0.4.12
    └── 0.5.7

Node.js本体もnpmでインストールされたモジュールも、全部ユーザーのホームに作った.naveに入ってて、かつ本体のバージョンごとに分かれていることが分かる。


個人の開発環境としてはかなり開発しやすくなったと思います。お疲れさまでした!

*1:リンボーに落ちないように気をつけろ!