Node Version Managerの略。Node.jsの管理はこれで。

package managerを使えば、簡単にNode.jsをinstallできそうだが、自分の環境はFreeBSDなので、package managerが無かったことと、nvmを使えばNode.jsの異なるバージョンもインストールできるので、これを使うことにする。

nvmをインストールするとnpmもインストールされる。

インストール

zshだと、エラーが頻繁に起こるようなので、bashでインストールを行うことにする。

基本的にはREADMEを見てインストールすればおk。

$ git clone git://github.com/creationix/nvm.git ~/.nvm
  
$ . ~/.nvm/nvm.sh

Node.jsの公式サイトに行ってみると、最新版はv0.6.11なので、それをインストールしようとしたが、エラーが出た。

$ nvm install v0.6.11
  
######################################################################## 100.0%
  
Checking for program g++ or c++ : /usr/bin/g++
  
Checking for program cpp : /usr/bin/cpp
  
Checking for program ar : /usr/bin/ar
  
Checking for program ranlib : /usr/bin/ranlib
  
Checking for g++ : ok
  
Checking for program gcc or cc : /usr/bin/gcc
  
Checking for gcc : ok
  
Checking for library dl : not found
  
Checking for library kvm : yes
  
Checking for library execinfo : not found
  
/usr/home/tmiwa/.nvm/src/node-v0.6.11/wscript:317: error: Install the libexecinfo port from /usr/ports/devel/libexecinfo.
  
nvm: install v0.6.11 failed!

libexecinfoをインストールする

# <span id="FreeBSD_81">FreeBSD 8.1の場合</span>

export PACKAGESITE=ftp://ftp.jp.freebsd.org/pub/FreeBSD/ports/amd64/packages-8-stable/Latest/

# <span id="PACKAGESITE-E">環境変数PACKAGESITEを使うために-Eオプションをつける</span>

sudo -E pkg_add -r libexecinfo

再チャレンジ

$ nvm install v0.6.11
  
######################################################################## 100.0%
  
Checking for program g++ or c++ : /usr/bin/g++
  
Checking for program cpp : /usr/bin/cpp
  
Checking for program ar : /usr/bin/ar
  
Checking for program ranlib : /usr/bin/ranlib
  
Checking for g++ : ok
  
Checking for program gcc or cc : /usr/bin/gcc
  
Checking for gcc : ok
  
Checking for library dl : not found
  
Checking for library kvm : yes
  
Checking for library execinfo : yes
  
Checking for openssl : not found
  
Checking for function SSL\_library\_init : yes
  
Checking for header openssl/crypto.h : yes
  
Checking for library util : yes
  
Checking for library rt : yes
  
Checking for fdatasync(2) with c++ : no
  
&#8216;configure&#8217; finished successfully (1.779s)
  
I need GNU make. Please run `gmake` instead.
  
make: don&#8217;t know how to make install. Stop
  
nvm: install v0.6.11 failed!

makeの代わりにgmakeを使えと言われるので~/.nvm/nvm.shのmakeをgmakeに、make installをgmake installに置換する。

再々チャレンジ

$ nvm install v0.6.11
  
####################################################################### 100.0%
  
curl: (33) HTTP server doesn&#8217;t seem to support byte ranges. Cannot resume.
  
nvm: install v0.6.11 failed!

また怒られる。READMEを見ると、「インストールに失敗したときは~/.nvm/src以下のファイルを削除しないと、このエラーが出るよ」と書いてあるので消して再々々チャレンジしたらうまく行った。

Node.jsとnvmを初めてインストールするときのハマりポイントと対策 – ess supに従い、ドットファイルを設定した。

zsh使用時のトラブルシューティング

「Node.jsとnvmを初めてインストールするときのハマりポイントと対策 – ess sup」で指摘されているエラー

このエラーは現在は解決しているが、気になったので調べてみた。

Node.jsとnvmを初めてインストールするときのハマりポイントと対策 – ess supに書いてあるように、#15: ZSH Integration by wavded for creationix/nvm – Pull Request – GitHubで指摘されていて、そこでは、

[bash title=”nvm.sh”]

-eval last=\${$#}

-export NVM_DIR=$(dirname $last)

+export NVM_DIR=$(cd $(dirname ${BASH_SOURCE[0]:-$0}); pwd)

[/bash]

とするとこで解決して、ess supでは

[bash title=”nvm.sh”]

-export NVM_DIR=$(dirname ${BASH_ARGV[0]})

+export NVM_DIR=$(cd $(dirname ${BASH_SOURCE[0]:-$0}); pwd)

[/bash]

することで、解決している。

それぞれの変数に何が入っているかを調べるために、以下をnvm.shに追加した。

[bash title=”nvm.sh”]

echo “1”$0

echo “2”${BASH_ARGV[0]}

echo “3”${BASH_SOURCE[0]}

eval echo “4”\${$#}

echo “5”$#

[/bash]

zshで実行すると

% . ~/.nvm/nvm.sh
  
1/home/tmiwa/.nvm/nvm.sh
  
2
  
3
  
4/home/tmiwa/.nvm/nvm.sh
  
5
  
/home/tmiwa/.nvm/nvm.sh:181: parse error near \`|&#8217;

最後のエラーはここでは気にしない(下で説明)。変数BASH*は空である。

bashで実行すると

[www6052ua:~]$ . ~/.nvm/nvm.sh
  
1bash
  
2/home/tmiwa/.nvm/nvm.sh
  
3/home/tmiwa/.nvm/nvm.sh
  
4bash
  
50

となる。

$0はシェルスクリプトのファイル名を表す変数。bashでも

$ bash ~/.nvm/nvm.sh
  
1/home/tmiwa/.nvm/nvm.sh
  
2
  
3/home/tmiwa/.nvm/nvm.sh
  
4/home/tmiwa/.nvm/nvm.sh
  
50

とやると、シェルスクリプト名が出るが、.の場合だとbashになってしまうらしい。

eval echo \${$#}は最後の引数を取るためのイディオム。evalでまず、変数の数を値として持つ$#を展開して、echo $2になって、echo $2を実行している……と思ったが、$#には0が入っている。./nvm.shを実行したのではなく、.で読み込んだのが原因だと思われる。しかし、./nvm.shで実行する形にすると、実行後に定義した関数が消えてしまうので、.で読み込む形でなくてはならない。

修正後のコードでは

export NVM\_DIR=$(cd $(dirname ${BASH\_SOURCE[0]:-$0}); pwd)

となっているが、${BASH_SOURCE[0]:-$0}の部分は${BASH_SOURCE[0]}に値があるならその値を、無いなら$0の値を使いなさいという意味(参照)。bashでもzshでも同じ値を取得できることがわかる。

/home/tmiwa/.nvm/nvm.sh:181: parse error near `|’

これはAを alias -g A='| awk' のようにグローバルエイリアスに設定していたために出るエラー。グローバルエイリアスをコメントアウトするか、変数Aを使っている箇所をBなどに変更する。

nvm:40: no matches found: -#

これはnvm installするときに出るエラー。curlのプログレスバーを出すオプション-#が、zshで違う意味に解釈されるために起こるらしい(参照)。

nvm_ls:17: no matches found: vdefault*

$ nvm alias default <version>

すると出なくなった。

設定

$ nvm alias default <version> #v0.6.11など

でdefaultのaliasを設定する。これを設定すると

$ nvm run default

でNode.jsのコンソールを起動できる。defaultを設定してない場合はバージョンを指定して起動する。

node.jsのバージョンを複数入れていない場合は、単に

node

でもいいみたい。

毎回設定するのが面倒なので

# <span id="nvm">nvm</span>

if [ -f ~/.nvm/nvm.sh ]; then
      
\# nvm.shにnvm用のMANPATHを追加する部分があるが
      
\# MANPATHはデフォルトだと空なので
      
\# MANPATH="$NVM_DIR/$2/share/man:$MANPATH"
      
\# だとnvmのマニュアルへのPATHのみになってしまうので
      
\# 予めセットしておく
      
export MANPATH=`manpath`

    . ~/.nvm/nvm.sh
    nvm alias default v0.6.11 &gt; /dev/null
    

fi

をシェルの設定ファイルに書いておく。