nvm でのちょっとした問題
node.js はまだまだバージョンアップが頻繁なプロジェクトなので, 複数バージョンを管理するなんらかの仕組みを使うのが現状の良いプラクティスになっています. いままでは nave を使っていたんですが, @Jxck_ に勧められたのと @summerwind さんのブログ でもいい感じと紹介されていたので, nvm を使ってみました.
nvm は Tim Caswll さんのプロジェクトです. インストール・使い方もとても簡単なので, github の readme を参照してください.
ただ nvm はツールとしてまだこなれていないようで, シェルの環境の違いを吸収しきれていない部分があります. 自分もちょっとした問題にひっかかりました.
extended_glob と curl の -# オプション問題
zsh には extended_glob という "#", "~", "^" などの記号を正規表現の特殊文字のように扱いファイルの指定などに使えるという機能があります.
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 問題
これは @Jxck_ がひっかかっていた問題ですが, 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`
参考
- GitHub - creationix/nvm: Node Version Manager - Simple bash script to manage multiple active node.js versions
- Node.jsの管理はnvmで – SummerWind
- Node.jsとnvmを初めてインストールするときのハマりポイントと対策 - mollifier delta blog
- rc ファイルの例を真似させてもらいました. node / nvm がインストールされている時だけ走らせる設定の仕方が紹介されています.
- tips for zsh -- zshの覚書 (1)
- bash 入門