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にインストールされていたようで、そこにパスを通しても解決できたらしい。
散々な結果です。