Node.jsとnvmを初めてインストールするときのハマりポイントと対策

最近何かと話題の Node.js を使ってみることにした。 インストール自体は公式の Wiki を見ればそんなに難しくない。いつもの configure, make, make install するだけだ。

でも Node.js はまだまだ開発中のプロジェクトで、今でもがんがん更新されてる。すぐに新しいバージョンが出てくるんだけど、そのたびにソースからインストールし直すのもいやだし、ちょっと前のバージョンに戻したくなることもあるかもしれない。

そんなわけで、最近の Node.js は nvm というツールを使うのが流行みたいだ。こいつを使うと複数バージョンのインストール、切り替えが出来るようなって便利。

Mac でも Linux(Ubuntu) でも使えるんだけど、微妙にハマったとこがあったので手順を書いておく。

2012/03/21追記

npm でのパッケージのインストール、設定について追記した。

準備

まず始めに、必要なパッケージとかをあらかじめインストールしておく。

Ubuntu の場合

Node.js をビルドできるようにするために、以下をインストールする。

% sudo aptitude install build-essential
% sudo aptitude install libssl-dev

あと、nvm は wgetcurl の両方が必要になる(統一しろよ...)。Ubuntu はデフォルトで curl が入っていないのでインストールしておこう。

% sudo aptitude install curl
Mac の場合

Mac でも基本的に Ubuntu と同じ。まず XCode をインストールして Node.js 自体をビルドできるようにしよう。

Mac の場合、 curl は入ってるんだけど wget が入っていないのでインストールする。

# homebrew を使う場合
% brew install wget

# Mac ports を使う場合
% sudo port install wget

もちろんインストール済みならそのままで OK。この辺は各自の環境に合わせて適当に調整しよう。

nvm のインストール

nvm は Node Version Manager のことで、Node.js のインストール、バージョンごとの管理、シェルの環境設定をやってくれる。

nvm を使うには Github のリポジトリをクローンする。

% git clone git://github.com/creationix/nvm.git ~/.nvm

あとは nvm 本体を source すれば OK。

% source ~/.nvm/nvm.sh
2012/03/20追記

以前は zsh でエラーが出ていたけど、現状の最新バージョンでは修正されてるので以下の対応は不要になった。念のため以前の対応内容も残しておく。

旧バージョンでエラーが出ていたときの対応(現在は不要)

... のはずなんだけど zsh の場合はエラーが出てしまう。実は nvm.sh は bash が前提になっていて、${BASH_ARGV[0]} ってとこが zsh で解釈できないからだ。

この問題は本家の Issues にも挙がってるので、それを参考に bash でも zsh でも動くように直した。

diff --git a/nvm.sh b/nvm.sh
index 99eb87a..9e9951b 100644
--- a/nvm.sh
+++ b/nvm.sh
@@ -5,8 +5,7 @@
 # Implemented by Tim Caswell <[email protected]>
 # with much bash help from Matthew Ranney

-# Auto detect the NVM_DIR using magic bash 3.x stuff
-export NVM_DIR=$(dirname ${BASH_ARGV[0]})
+export NVM_DIR=$(cd $(dirname ${BASH_SOURCE[0]:-$0}); pwd)

 nvm()
 {

これを適応して、改めて source してみよう。

% source ~/.nvm/nvm.sh

エラーが出なくなった。よしよし。

nvm を使用して Node.js をインストールする

いよいよ Node.js 本体をインストールする。nvm がちゃんと入っていればコマンド1つ打つだけでよくて簡単。

今回は 0.4.0 をインストールした。

% nvm install v0.4.0

インストールできたら use コマンドを使って環境を切り替える。

% nvm use v0.4.0
Now using node v0.4.0

ちゃんとインストールできてるか確認してみよう。

% node --version
v0.4.0

OKOK。パスも通ってる。

別のバージョンもインストールできる。試しに0.3系もインストールしてみた。

% nvm install v0.3.8

複数インストールした後は nvm ls コマンドでバージョン一覧が見れる。

% nvm ls
v0.3.8
v0.4.0 *

今有効になってるバージョンには * がつく。別のバージョンに切り替えたいときは use コマンドを使おう。

% nvm use v0.3.8
Now using node v0.3.8

% node --version
v0.3.8

これで複数のバージョンを切り替えできるようになったし、新しいバージョンが出ても簡単に更新できる。

インストールできるバージョン一覧は nvm コマンドでは見れないので、公式のダウンロードページで確認しよう。

npm でモジュールをインストールする

Node.jsでは npm を使って追加のパッケージを管理する。nvm を使うと npm も使えるようになっているので早速試してみる。
バージョンは node v0.6.9, npm 1.1.0-3 で確認した。

# formidable パッケージをインストール
% npm install -g formidable

-g オプションを付けるとグローバルインストールになって、Node.js がインストールされている共通の領域にパッケージがインストールされる。nvm を使用している環境の場合、バージョン別の場所にパッケージがインストールされる形になる。
例えば nvm use v0.6.9 をした後は ~/.nvm/v0.6.9/lib/node_modules の下にインストールされる。

ただし、こうやってインストールしたパッケージを使おうと node を起動しても「見つかりません」というエラーが出てしまう。

これを防ぐために NODE_PATH 環境変数を指定する。node 本体は NODE_PATH からパッケージを探してくれるので、パッケージをインストールしたディレクトリを指定しておけばうまく動く。

# nvm use した後に以下を実行
% export NODE_PATH=${NVM_PATH}_modules

シェルの設定を追加

nvm の設定はログアウトすると無くなってしまうので、シェルの初期化ファイルに書いておこう。

# ~/.zshenv, ~/.bash_profile などに以下を追加
source ~/.nvm/nvm.sh
nvm use "v0.4.0"

ただし、この書き方の場合 nvm とかがインストールされてない環境で余計なエラーが出てしまう。それではかっこわるいのでインストール済みかどうかチェックするようにした。

# nvm と指定されたバージョンの Node.js がインストール済みの場合だけ
# 設定を有効にする
if [[ -f ~/.nvm/nvm.sh ]]; then
  source ~/.nvm/nvm.sh

  if which nvm >/dev/null 2>&1 ;then
    _nodejs_use_version="v0.4.0"
    if nvm ls | grep -F -e "${_nodejs_use_version}" >/dev/null 2>&1 ;then
      nvm use "${_nodejs_use_version}" >/dev/null
      export NODE_PATH=${NVM_PATH}_modules${NODE_PATH:+:}${NODE_PATH}
    fi
    unset _nodejs_use_version
  fi
fi

インストール済みの場合だけ nvm use するようにした。.zshrc をいろんな環境で使い回してるときはこうした方がいいと思う。

これでインストールと環境設定は終わり。新しいバージョンが出てきても簡単に設定を変えれるようになったし、もう安心だ。