node.js のバージョン管理ツール ndenv を試した

Ubuntu にバンドルされている Node.js で利用すると、バージョンを自由に選べない。Googleで調べたらndenv という pyenv や rbenv に良く似たツールがあったので使ってみた。

参照サイト GitHub riywo/ndenv https://github.com/riywo/ndenv

## 作業ディレクトリ
一般ユーザーのホームディレクトリにインストールします。 いろいろ共存です。

```
tkr@tkr02:~$ ls -la
合計 64
drwxr-xr-x  9 tkr  tkr  4096  1月  2 11:17 .
drwxr-xr-x  3 root root 4096  1月  2 07:58 ..
-rw-------  1 tkr  tkr  1903  1月  2 18:15 .bash_history
-rw-r--r--  1 tkr  tkr   220  1月  2 07:58 .bash_logout
-rw-rw-r--  1 tkr  tkr   152  1月  2 08:32 .bash_profile
-rw-r--r--  1 tkr  tkr  3637  1月  2 07:58 .bashrc
drwx------  3 tkr  tkr  4096  1月  2 08:23 .cache
drwx------  2 tkr  tkr  4096  1月  2 09:15 .emacs.d
drwxrwxr-x  3 tkr  tkr  4096  1月  2 09:08 .gem
-rw-r--r--  1 tkr  tkr   675  1月  2 07:58 .profile
drwxrwxr-x 12 tkr  tkr  4096  1月  2 08:30 .pyenv
drwxrwxr-x 12 tkr  tkr  4096  1月  2 08:43 .rbenv
-rw-------  1 tkr  tkr   174  1月  2 08:47 .softlayer
drwxr-xr-x  2 tkr  tkr  4096  1月  2 08:02 .ssh
drwxr-xr-x  2 root root 4096  1月  2 11:16 .vim
-rw-------  1 tkr  tkr  2297  1月  2 11:17 .viminfo
```

## GitHub からツールをクローン

```
tkr@tkr02:~$ git clone https://github.com/riywo/ndenv ~/.ndenv
Cloning into '/home/tkr/.ndenv'...
remote: Counting objects: 63, done.
remote: Total 63 (delta 0), reused 0 (delta 0), pack-reused 63
Unpacking objects: 100% (63/63), done.
Checking connectivity... done.
```

## ログインシェルに設定を追加

```
tkr@tkr02:~$ echo 'export PATH="$HOME/.ndenv/bin:$PATH"' >> ~/.bash_profile
tkr@tkr02:~$ echo 'eval "$(ndenv init -)"' >> ~/.bash_profile
tkr@tkr02:~$ exec $SHELL -l
tkr@tkr02:~$ ndenv -v
ndenv 0.4.0-4-ga339097
```

## GitHub から node-build をクローン

```
tkr@tkr02:~$ git clone https://github.com/riywo/node-build.git ~/.ndenv/plugins/node-build
Cloning into '/home/tkr/.ndenv/plugins/node-build'...
remote: Counting objects: 68, done.
remote: Total 68 (delta 0), reused 0 (delta 0), pack-reused 68
Unpacking objects: 100% (68/68), done.
Checking connectivity... done.
```

## 導入可能なバージョンをリストする

```
tkr@tkr02:~$ ndenv install -l
Available versions:
  v0.1.14
  v0.1.15
中略
  v0.12.4
  v0.12.5
  v0.12.6
  v0.12.7
  v0.12.8
  v0.12.9
中略
  iojs-v3.2.0
  iojs-v3.3.0
  iojs-v3.3.1
中略
```

## バージョンを指定してインストール
最後におまじないの rehash を忘れない様にとね。

```
tkr@tkr02:~$ ndenv install v0.12.9
Downloading node-v0.12.9-linux-x64.tar.gz...
-> https://nodejs.org/dist/v0.12.9/node-v0.12.9-linux-x64.tar.gz
Installing node-v0.12.9-linux-x64...
Installed node-v0.12.9-linux-x64 to /home/tkr/.ndenv/versions/v0.12.9
tkr@tkr02:~$ ndenv rehash
```

## 導入されているか確認

```
tkr@tkr02:~$ ndenv versions
  v0.12.9
tkr@tkr02:~$ ndenv global v0.12.9
tkr@tkr02:~$ node -v
v0.12.9 
```

## テストぺージ作成


### FWの設定追加

OSファイアウォールに TCP/8080 を開く様に設定

```
tkr@tkr02:~$ sudo -s
root@tkr02:~# ufw allow 8080
ルールを追加しました
ルールを追加しました (v6)
root@tkr02:~# ufw status
状態: アクティブ

To                         Action      From
--                         ------      ----
Anywhere                   ALLOW       10.0.0.0/8
80                         ALLOW       Anywhere
1883                       ALLOW       Anywhere
8080                       ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
1883 (v6)                  ALLOW       Anywhere (v6)
8080 (v6)                  ALLOW       Anywhere (v6)
```

### httpサーバーのコード

HTTPサーバーの最も簡単なコードを作成します。

```lang:server.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, '0.0.0.0');
```

### node.js上で httpサーバーの実行

上記で作ったコードをnodeコマンドの引数に与えて実行します。簡単にHTTPサーバーができてるので、ちょっとビックリ!

```
tkr@tkr02:~$ node server.js 
```



### ブラウザからの確認
IPアドレスかドメイン名でアクセスして確認します。 Hello World が表示されていれば成功です。

![firefox.png](https://qiita-image-store.s3.amazonaws.com/0/42829/d192a456-a12c-8943-c2e4-ad22c7d797b4.png)



## npmも使ってみる

```
tkr@tkr02:~$ npm install mqtt --save
 
> utf-8-validate@1.2.1 install /home/tkr/node_modules/mqtt/node_modules/websocket-stream/node_modules/ws/node_modules/utf-8-validate
> node-gyp rebuild

make: ディレクトリ `/home/tkr/node_modules/mqtt/node_modules/websocket-stream/node_modules/ws/node_modules/utf-8-validate/build' に入ります
  CXX(target) Release/obj.target/validation/src/validation.o
  SOLINK_MODULE(target) Release/obj.target/validation.node
  COPY Release/validation.node
make: ディレクトリ `/home/tkr/node_modules/mqtt/node_modules/websocket-stream/node_modules/ws/node_modules/utf-8-validate/build' から出ます

> bufferutil@1.2.1 install /home/tkr/node_modules/mqtt/node_modules/websocket-stream/node_modules/ws/node_modules/bufferutil
> node-gyp rebuild

make: ディレクトリ `/home/tkr/node_modules/mqtt/node_modules/websocket-stream/node_modules/ws/node_modules/bufferutil/build' に入ります
  CXX(target) Release/obj.target/bufferutil/src/bufferutil.o
  SOLINK_MODULE(target) Release/obj.target/bufferutil.node
  COPY Release/bufferutil.node
make: ディレクトリ `/home/tkr/node_modules/mqtt/node_modules/websocket-stream/node_modules/ws/node_modules/bufferutil/build' から出ます
mqtt@1.6.3 node_modules/mqtt
├── inherits@2.0.1
├── reinterval@1.0.2
├── xtend@4.0.1
├── minimist@1.2.0
├── commist@1.0.0 (leven@1.0.2)
├── readable-stream@1.0.33 (isarray@0.0.1, string_decoder@0.10.31, core-util-is@1.0.2)
├── end-of-stream@1.1.0 (once@1.3.3)
├── mqtt-packet@3.4.4 (bl@0.9.4)
├── help-me@0.1.0 (pump@1.0.1)
├── mqtt-connection@2.1.1 (through2@0.6.5, reduplexer@1.1.0)
├── concat-stream@1.5.1 (typedarray@0.0.6, readable-stream@2.0.5)
└── websocket-stream@2.3.0 (through2@2.0.0, duplexify@3.4.2, ws@0.8.1)
```