Pages

2011年5月16日月曜日

node.js と npmをインストール

node.jsやらcoffee scriptやらTitanium を試してみたくて、さくらのVPSにインストールする。
例によって、いろいろと試行錯誤した(混乱した)ので、又記録しておく。

実は、node.jsだけならば一度入れたことがありました。その時の手順は以下の通り。

$ mkdir work/node
 $ cd work/node/
 $ wget http://nodejs.org/dist/node-v0.4.0.tar.gz 
 $ tar xzf node-v0.4.0.tar.gz 
 $ cd node-v0.4.0
 $ ./configure 
 $ make 
 $ sudo make install

この時はサンプルプログラム(以下)を作って実行してみた。
/* file name : server.js
var http = require('http'); // httpライブラリを呼ぶ
http.createServer(function(request,response){
 response.writeHead(200, {'Content-Type':'text/plain'});
 response.end('Hello World');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124');

$ node server.js & 

今回はnode.js環境のパッケージマネージャであるnpmを導入して、様々なモジュールを試すための準備をすることだった。

混乱の最初は、nave。node.jsの複数のバージョンを切り替えるツールだが、これが必須だと勘違いしてしまったこと。node.jsは凄い勢いでヴァージョンがアップされているらしく、まだ仕様が安定していない。そのための対策で、rubyではrvmが有名。naveの他にnvmと言う同様の機能をもつツールもあるのだが、それがnpmと名前が似ているもんで、さらに混乱。

結局、naveは今回スキップ。
npmをgitで入れることにした。
$ git clone http://github.com/isaacs/npm.git
 $ cd npm
 $ sudo make install
! [ -d .git ] || git submodule update --init
bash: git: command not found
make: *** [submodules] エラー 127
失敗。「modulesが見つからないです」と叫ばれる。gitコマンドを調べてみる。
$ git submodule
-3d509ef6a503703e357f2ffa1df05e4f09a43bba node_modules/abbrev
-8b4395bf931a9b0d27fbb24d6f41d2a1cdbb61cb node_modules/nopt
-6e8da86d6a391f4a001971209cf1f4a66d060c4e node_modules/semver
なんだ。パッケージがないのか!と勝った気になって
$ git submodule init
$ git submodule update
$ git submodule
 3d509ef6a503703e357f2ffa1df05e4f09a43bba node_modules/abbrev (v1.0.2-3-g3d509ef)
 8b4395bf931a9b0d27fbb24d6f41d2a1cdbb61cb node_modules/nopt (v1.0.4)
 6e8da86d6a391f4a001971209cf1f4a66d060c4e node_modules/semver (v1.0.5)
よし入った。これで $ sudo make install が入らない?! 似たようなエラー。
それでは、本家npmの指示に従い
$ sudo node ./cli.js install -g
 $ npm -v
 1.0.6
これで、入ったっぽい。
良し。それでは、パッケージを試しに入れてみる。
$ npm install socket.io
 $ npm ls
 (empty)
ん? ない。そして、カレントディレクトリにnpm_modulesとか出来ている。その中にsocket.ioが入っている。なんじゃ?
いろいろ、やったが不明なので、npmをアンインストールすることに。
$ sudo npm uninstall npm -g
/usr/bin/env: node: そのようなファイルやディレクトリはありません
ええ!? これは、調べて visudoコマンドで、sudo時の環境変数リセット停止を設定。

Defaults    env_reset
Defaluts:%wheel !env_reset
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"
どうも、原因は
  • sudo実行時のnodeへのパスが通っていなかったこと
  • npmのインストール先は、/usr/localらしいが、此処には userレベルでのインストール権限がない
ことのようだ。npmの思想として、ローカルにインストールすることを前提としているらしい。恐らく、セキュリティの関係だと思うが。
結局、以下のサイトに従い、インストールした。
http://havelog.ayumusato.com/develop/javascript/e210-install_nodejs_and_npm.html

$ sudo chown -R $USER /usr/local
 $ curl http://npmjs.org/install.sh | sh
 $ sudo chown -R root /usr/local
 $ sudo npm install socket.io 
 $ sudo npm install express # 注: この前にnode.jsのバージョンを上げている
 $ npm ls
/home/baker
├─┬ express@2.3.4 
│ ├── connect@1.4.1 
│ ├── mime@1.2.2 
│ └── qs@0.1.0 
└── socket.io@0.6.17 
気持ちが悪いのは、node_modulesフォルダが、ユーザのホームディレクトリに出来ていること。
早速、coffee script をインストールしてみた。
$ npm install coffee-script
$ coffee -v
-bash: coffee: command not found
$ npm ls
/home/baker
├── coffee-script@1.1.1 
├─┬ express@2.3.4 
│ ├── connect@1.4.1 
│ ├── mime@1.2.2 
│ └── qs@0.1.0 
└── socket.io@0.6.17 
また変だ! 大体、プログラム本体は何処にいったのか?
結局、私が作ったnode, npm の環境はグローバルなので、
  • sudo による実行
  • -g オプションは必須
  • その結果 /usr/local/bin/ に、コマンドがインストールされる(リンク)
以下、インストールのやり直し
$ sudo npm install -g coffee-script
/usr/local/bin/cake -> /usr/local/lib/node_modules/coffee-script/bin/cake
/usr/local/bin/coffee -> /usr/local/lib/node_modules/coffee-script/bin/coffee
coffee-script@1.1.1 /usr/local/lib/node_modules/coffee-script
$ sudo npm install -g express
/usr/local/bin/express -> /usr/local/lib/node_modules/express/bin/express
connect@1.4.1 /usr/local/lib/node_modules/express/node_modules/connect
mime@1.2.2 /usr/local/lib/node_modules/express/node_modules/mime
qs@0.1.0 /usr/local/lib/node_modules/express/node_modules/qs
express@2.3.4 /usr/local/lib/node_modules/express
$ sudo npm -g install socket.io
socket.io@0.6.18 /usr/local/lib/node_modules/socket.io

$ npm uninstall express
$ npm uninstall socket.io
$ npm uninstall coffee-script

$ npm ls
/home/baker
(empty)

$ sudo npm -g ls
/usr/local/lib
├── coffee-script@1.1.1 
├─┬ express@2.3.4 
│ ├── connect@1.4.1 
│ ├── mime@1.2.2 
│ └── qs@0.1.0 
├─┬ npm@1.0.6 
│ ├── abbrev@1.0.3 
│ ├── node-uuid@1.1.0 
│ ├── nopt@1.0.4 
│ └── semver@1.0.5 
└── socket.io@0.6.18 
(追記)
あとで調べてみたところでは、.npmrcにパスを書き、あくまでローカルで実行する手もあったようだし、それが推薦のようだ。
実際に、npm install でローカルにインストールされたコマンドは、node_modules/.binにインストールされていたようで、そこにパスを通しても解決できたらしい。
散々な結果です。

0 件のコメント:

コメントを投稿