いろいろやってみるにっき

てきとーに生きている奴の日記

古いエントリのサムネイル画像がリンク切れになってたりするけど、チマチマ修正中


Bash on Ubuntu on Windows(Windows 10で動くBash)にNode.js入れてみた

結論からいえば頑張って動かした。Windows側からも確認できた。しかしまあ、Bash on Ubuntu on Windowsっていう名称、onばっかりだな。

 

関連エントリ


Node.jsとnpmのインストール

npmがうまくインストールできない

 まずはインストール。apt-getで入れるモジュールは nodejs と npmなのだが、

apt-get install nodejs

で、Node.jsはきちんとインストールできる。しかし、

apt-get install npm

を実行してもきちんとインストールできず、結果はこうなる。

root@STRIKEEAGLE:~# apt-get install npm
パッケージリストを読み込んでいます... 完了0%
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 npm : 依存: nodejs しかし、インストールされようとしていません
       依存: node-abbrev (>= 1.0.4) しかし、インストールされようとしていません
       依存: node-ansi しかし、インストールされようとしていません
       依存: node-archy しかし、インストールされようとしていません
       依存: node-block-stream しかし、インストールされようとしていません
       依存: node-fstream (>= 0.1.22) しかし、インストールされようとしていません
       依存: node-fstream-ignore しかし、インストールされようとしていません
       依存: node-github-url-from-git しかし、インストールされようとしていません
       依存: node-glob (>= 3.1.21) しかし、インストールされようとしていません
       依存: node-graceful-fs (>= 2.0.0) しかし、インストールされようとしていません
       依存: node-inherits しかし、インストールされようとしていません
       依存: node-ini (>= 1.1.0) しかし、インストールされようとしていません
       依存: node-lockfile しかし、インストールされようとしていません
       依存: node-lru-cache (>= 2.3.0) しかし、インストールされようとしていません
       依存: node-minimatch (>= 0.2.11) しかし、インストールされようとしていません
       依存: node-mkdirp (>= 0.3.3) しかし、インストールされようとしていません
       依存: node-gyp (>= 0.10.9) しかし、インストールされようとしていません
       依存: node-nopt (>= 2.1.1) しかし、インストールされようとしていません
       依存: node-npmlog しかし、インストールされようとしていません
       依存: node-once しかし、インストールされようとしていません
       依存: node-osenv しかし、インストールされようとしていません
       依存: node-read しかし、インストールされようとしていません
       依存: node-read-package-json (>= 1.1.0) しかし、インストールされようとしていません
       依存: node-request (>= 2.25.0) しかし、インストールされようとしていません
       依存: node-retry しかし、インストールされようとしていません
       依存: node-rimraf (>= 2.2.2) しかし、インストールされようとしていません
       依存: node-semver (>= 2.1.0) しかし、インストールされようとしていません
       依存: node-sha しかし、インストールされようとしていません
       依存: node-slide しかし、インストールされようとしていません
       依存: node-tar (>= 0.1.18) しかし、インストールされようとしていません
       依存: node-which しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

というエラーメッセージである。apt-get update等を実行しても解消できない。npm -vで確認してみるとこの通り。

root@STRIKEEAGLE:~# npm -v

/usr/lib/node_modules/npm/node_modules/npmconf/config-defs.js:320
  Object.keys(os.networkInterfaces()).map(function (nic) {
                 ^
Error: EINVAL, invalid argument
    at getLocalAddresses (/usr/lib/node_modules/npm/node_modules/npmconf/config-defs.js:320:18)
    at Object. (/usr/lib/node_modules/npm/node_modules/npmconf/config-defs.js:268:23)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object. (/usr/lib/node_modules/npm/node_modules/npmconf/npmconf.js:4:18)
    at Module._compile (module.js:456:26)

npmはapt-getではなくcurlでインストール

そこで色々調べていった結果、このコマンドに行きついた。

curl -0 -L http://npmjs.org/install.sh | sudo sh

実行結果は次の通り。少し長いので中略している。

root@STRIKEEAGLE:~# curl -0 -L http://npmjs.org/install.sh | sudo sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0   193    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100  6263  100  6263    0     0   1811      0  0:00:03  0:00:03 --:--:--  9650
tar=/bin/tar
version:
tar (GNU tar) 1.27.1
Copyright (C) 2013 Free Software Foundation, Inc.
使用許諾 GPLv3+: GNU GPL version 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[参考訳]
これはフリーソフトウェアです. 変更と再配布は自由です.
法律で認められる範囲で「無保証」です.

作者: John Gilmore, Jay Fenlason.
install npm@latest
fetching: http://registry.npmjs.org/npm/-/npm-3.10.2.tgz

(中略)

  ├── uid-number@0.0.6
  ├── umask@1.1.0
  ├─┬ unique-filename@1.1.0
  │ └── unique-slug@2.0.0
  ├── unpipe@1.0.0
  ├─┬ validate-npm-package-license@3.0.1
  │ ├─┬ spdx-correct@1.0.2
  │ │ └── spdx-license-ids@1.2.0
  │ └─┬ spdx-expression-parse@1.0.2
  │   ├── spdx-exceptions@1.0.4
  │   └── spdx-license-ids@1.2.0
  ├─┬ validate-npm-package-name@2.2.2
  │ └── builtins@0.0.7
  ├─┬ which@1.2.10
  │ └── isexe@1.1.2
  ├── wrappy@1.0.2
  └── write-file-atomic@1.1.4

It worked

このcurlできちんとnpmは入ったっぽい。npm -vで確認すると、

root@STRIKEEAGLE:~# npm -v
3.10.2

となる。この curl -0 -L http://npmjs.org/install.sh | sudo sh は、下記のサイトを参考にした。

Node.jsの動作確認

REPLで動作確認

続いてREPL(Read eval print loop:対話的実行環境)でNode.jsの動作確認。Bash on Ubuntu on Windows

root@STRIKEEAGLE:~# node
> var message = "こんにちは";
undefined
> message
'こんにちは'
> console.log(message + "shigeo-t");
こんにちはshigeo-t
undefined
>
(^C again to quit)
>
root@STRIKEEAGLE:~#

ときちんと動く。 

npmコマンドの動作確認

npmコマンドの動作確認としてgulpコマンドを入れてみる。

root@STRIKEEAGLE:~# npm install -g gulp
npm WARN deprecated graceful-fs@3.0.8: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated lodash@1.0.2: lodash@<3.0.0 is="" no="" longer="" maintained="" upgrade="" to="" lodash="" 4="" 0="" npm="" warn="" deprecated="" graceful-fs="" 1="" 2="" 3:="" v3="" and="" before="" will="" fail="" on="" node="" releases="">= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
/usr/bin/gulp -> /usr/lib/node_modules/gulp/bin/gulp.js
/usr/lib
└─┬ gulp@3.9.1
  ├── archy@1.0.0
  ├─┬ chalk@1.1.3
  │ ├── ansi-styles@2.2.1
  │ ├── escape-string-regexp@1.0.5
  │ ├─┬ has-ansi@2.0.0
  │ │ └── ansi-regex@2.0.0
  │ ├── strip-ansi@3.0.1
  │ └── supports-color@2.0.0
  ├── deprecated@0.0.1
  ├─┬ gulp-util@3.0.7
  │ ├── array-differ@1.0.0
  │ ├── array-uniq@1.0.3
  │ ├── beeper@1.1.0
  │ ├─┬ dateformat@1.0.12
  │ │ ├── get-stdin@4.0.1
  │ │ └─┬ meow@3.7.0
  │ │   ├─┬ camelcase-keys@2.1.0
  │ │   │ └── camelcase@2.1.1
  │ │   ├── decamelize@1.2.0
  │ │   ├─┬ loud-rejection@1.5.0
  │ │   │ ├─┬ currently-unhandled@0.4.1
  │ │   │ │ └── array-find-index@1.0.1
  │ │   │ └── signal-exit@3.0.0
  │ │   ├── map-obj@1.0.1
  │ │   ├─┬ normalize-package-data@2.3.5
  │ │   │ ├── hosted-git-info@2.1.5
  │ │   │ ├─┬ is-builtin-module@1.0.0
  │ │   │ │ └── builtin-modules@1.1.1
  │ │   │ └─┬ validate-npm-package-license@3.0.1
  │ │   │   ├─┬ spdx-correct@1.0.2
  │ │   │   │ └── spdx-license-ids@1.2.1
  │ │   │   └─┬ spdx-expression-parse@1.0.2
  │ │   │     └── spdx-exceptions@1.0.4
  │ │   ├── object-assign@4.1.0
  │ │   ├─┬ read-pkg-up@1.0.1
  │ │   │ ├─┬ find-up@1.1.2
  │ │   │ │ ├── path-exists@2.1.0
  │ │   │ │ └─┬ pinkie-promise@2.0.1
  │ │   │ │   └── pinkie@2.0.4
  │ │   │ └─┬ read-pkg@1.1.0
  │ │   │   ├─┬ load-json-file@1.1.0
  │ │   │   │ ├── graceful-fs@4.1.4
  │ │   │   │ ├─┬ parse-json@2.2.0
  │ │   │   │ │ └─┬ error-ex@1.3.0
  │ │   │   │ │   └── is-arrayish@0.2.1
  │ │   │   │ ├── pify@2.3.0
  │ │   │   │ └── strip-bom@2.0.0
  │ │   │   └── path-type@1.1.0
  │ │   ├─┬ redent@1.0.0
  │ │   │ ├─┬ indent-string@2.1.0
  │ │   │ │ └─┬ repeating@2.0.1
  │ │   │ │   └─┬ is-finite@1.0.1
  │ │   │ │     └── number-is-nan@1.0.0
  │ │   │ └── strip-indent@1.0.1
  │ │   └── trim-newlines@1.0.0
  │ ├─┬ fancy-log@1.2.0
  │ │ └── time-stamp@1.0.1
  │ ├─┬ gulplog@1.0.0
  │ │ └── glogg@1.0.0
  │ ├─┬ has-gulplog@0.1.0
  │ │ └── sparkles@1.0.0
  │ ├── lodash._reescape@3.0.0
  │ ├── lodash._reevaluate@3.0.0
  │ ├── lodash._reinterpolate@3.0.0
  │ ├─┬ lodash.template@3.6.2
  │ │ ├── lodash._basecopy@3.0.1
  │ │ ├── lodash._basetostring@3.0.1
  │ │ ├── lodash._basevalues@3.0.0
  │ │ ├── lodash._isiterateecall@3.0.9
  │ │ ├─┬ lodash.escape@3.2.0
  │ │ │ └── lodash._root@3.0.1
  │ │ ├─┬ lodash.keys@3.1.2
  │ │ │ ├── lodash._getnative@3.9.1
  │ │ │ ├── lodash.isarguments@3.0.8
  │ │ │ └── lodash.isarray@3.0.4
  │ │ ├── lodash.restparam@3.6.1
  │ │ └── lodash.templatesettings@3.1.1
  │ ├─┬ multipipe@0.1.2
  │ │ └─┬ duplexer2@0.0.2
  │ │   └── readable-stream@1.1.14
  │ ├── object-assign@3.0.0
  │ ├── replace-ext@0.0.1
  │ ├─┬ through2@2.0.1
  │ │ ├─┬ readable-stream@2.0.6
  │ │ │ ├── core-util-is@1.0.2
  │ │ │ ├── inherits@2.0.1
  │ │ │ ├── isarray@1.0.0
  │ │ │ ├── process-nextick-args@1.0.7
  │ │ │ ├── string_decoder@0.10.31
  │ │ │ └── util-deprecate@1.0.2
  │ │ └── xtend@4.0.1
  │ └─┬ vinyl@0.5.3
  │   ├── clone@1.0.2
  │   └── clone-stats@0.0.1
  ├── interpret@1.0.1
  ├─┬ liftoff@2.2.4
  │ ├── extend@3.0.0
  │ ├─┬ findup-sync@0.3.0
  │ │ └─┬ glob@5.0.15
  │ │   ├── inflight@1.0.5
  │ │   ├── minimatch@3.0.2
  │ │   └── path-is-absolute@1.0.0
  │ ├── flagged-respawn@0.3.2
  │ ├── rechoir@0.6.2
  │ └── resolve@1.1.7
  ├── minimist@1.2.0
  ├─┬ orchestrator@0.3.7
  │ ├─┬ end-of-stream@0.1.5
  │ │ └─┬ once@1.3.3
  │ │   └── wrappy@1.0.2
  │ ├── sequencify@0.0.7
  │ └── stream-consume@0.1.0
  ├── pretty-hrtime@1.0.2
  ├── semver@4.3.6
  ├─┬ tildify@1.2.0
  │ └── os-homedir@1.0.1
  ├─┬ v8flags@2.0.11
  │ └── user-home@1.1.1
  └─┬ vinyl-fs@0.3.14
    ├── defaults@1.0.3
    ├─┬ glob-stream@3.1.18
    │ ├── glob@4.5.3
    │ ├─┬ glob2base@0.0.12
    │ │ └── find-index@0.1.1
    │ ├─┬ minimatch@2.0.10
    │ │ └─┬ brace-expansion@1.1.5
    │ │   ├── balanced-match@0.4.1
    │ │   └── concat-map@0.0.1
    │ ├── ordered-read-streams@0.1.0
    │ ├─┬ through2@0.6.5
    │ │ └── readable-stream@1.0.34
    │ └── unique-stream@1.0.0
    ├─┬ glob-watcher@0.0.6
    │ └─┬ gaze@0.5.2
    │   └─┬ globule@0.1.0
    │     ├─┬ glob@3.1.21
    │     │ ├── graceful-fs@1.2.3
    │     │ └── inherits@1.0.2
    │     ├── lodash@1.0.2
    │     └─┬ minimatch@0.2.14
    │       ├── lru-cache@2.7.3
    │       └── sigmund@1.0.1
    ├── graceful-fs@3.0.8
    ├─┬ mkdirp@0.5.1
    │ └── minimist@0.0.8
    ├─┬ strip-bom@1.0.0
    │ ├── first-chunk-stream@1.0.0
    │ └── is-utf8@0.2.1
    ├─┬ through2@0.6.5
    │ └─┬ readable-stream@1.0.34
    │   └── isarray@0.0.1
    └─┬ vinyl@0.4.6
      └── clone@0.2.0

root@STRIKEEAGLE:~# gulp -v
[03:01:47] CLI version 3.9.1

と、こちらも動く。

Node.jsでWebサーバ

下記の記事からサンプルjsを参照し、Webサーバを起動してみる。

//httpモジュールをインポート
var http = require('http');
 
//Webサーバーの設定
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(3000);
 
console.log('Server running at http://localhost:3000/');
app.js

 実行してみる。

root@STRIKEEAGLE:~# node app.js
Server running at http://localhost:3000/

Windows側のブラウザからアクセス。 

f:id:shigeo-t:20160625032603p:plain

localhostならBash on Ubuntu on Windowsで起動したものにWindowsからアクセスできるんだな(@_@。Bash側でCtrl + Cでこのjsを停止すると、「アクセスできません」に変わるので間違いない。

f:id:shigeo-t:20160625032942p:plain

 

結論

本番がLinuxマシンで、WindowsでNode.jsアプリの開発・テストをやるなら、LinuxVMや、WindowsにNode.jsの環境を作るより、Bash on Ubuntu on Windowsのほうがいいかも。今のところ、Insider PreviewじゃなきゃBash on Ubuntu on Windowsは使えないけど。

シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA

シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA

 
Nodeクックブック

Nodeクックブック

 

 同じPC上にUbuntuVMも作っているんだけど、コマンドの動きはVMのほうが速いような気がする。

長くなったので別エントリにするけど、Bash on Ubuntu on Windows上で、Loopbackが動いちゃったw。これは捗る。

f:id:shigeo-t:20160625034734p:plain

お時間あったら、他のエントリもクリックして頂ければ幸いです。