18 April 2011

nvm でのちょっとした問題

node.js はまだまだバージョンアップが頻繁なプロジェクトなので, 複数バージョンを管理するなんらかの仕組みを使うのが現状の良いプラクティスになっています. いままでは nave を使っていたんですが, @ に勧められたのと @summerwind さんのブログ でもいい感じと紹介されていたので, nvm を使ってみました.

nvm は Tim Caswll さんのプロジェクトです. インストール・使い方もとても簡単なので, github の readme を参照してください.

GitHub - creationix/nvm: Node Version Manager - Simple bash script to manage multiple active node.js versions

ただ nvm はツールとしてまだこなれていないようで, シェルの環境の違いを吸収しきれていない部分があります. 自分もちょっとした問題にひっかかりました.

extended_glob と curl の -# オプション問題

zsh には extended_glob という "#", "~", "^" などの記号を正規表現の特殊文字のように扱いファイルの指定などに使えるという機能があります.

tips for zsh -- zshの覚書 (1)

nvm.sh の 111 行目では以下のように curl の -# オプションが使われています.

        curl -C - -# "http://nodejs.org/dist/node-$VERSION.tar.gz" -o "node-$VERSION.tar.gz" && \

curl の -# は通信の進捗を "#" を使ったプログレスバーで表示させるというオプションです. この "#" が extended_glob の機能によって zsh の正規表現と解釈されてしまい, nvm install したときに以下のようなエラーが出てしまいます.

nvm:40: no matches found: -#

バックスラッシュでエスケープするか, 全く同じ意味の --progress-bar オプションに変えることで回避できます.

# バックスラッシュでエスケープ
curl -C - -\# "http://nodejs.org/dist/node-$VERSION.tar.gz" -o "node-$VERSION.tar.gz" && \

# --progress-bar に置き換え
curl -C - --progress-bar "http://nodejs.org/dist/node-$VERSION.tar.gz" -o "node-$VERSION.tar.gz" && \

ls への alias 問題

これは @ がひっかかっていた問題ですが, ls に "ls -l" などとエイリアスはられているとうまく動作しません.

nvm.sh の中ではインストール済みのバージョンのチェックなどに ls コマンドを使っている部分があります. ここで ls に alias がはられていたので, nvm install 時に以下のようなエラーが出ていました.

nvm: install drwxr-xr-x  6 kosei  staff  204  4 17 04:19 v0.4.6 failed!

こちらを参考に, コマンドの前にバックスラッシュをつけてエイリアスを一時的に外すことで回避できました.

# nvm.sh の59行目の例. ほかの部分も置き換える必要あり
        VERSION=`(cd $NVM_DIR; \ls -d v${PATTERN}* 2>/dev/null) | sort -t. -k 2,1n -k 2,2n -k 3,3n | tail -n1`

いずれの問題も @ から 報告済です

参考