読者です 読者をやめる 読者になる 読者になる

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

なんとか自分の会社を立ち上げるところまで漕ぎ着けた、てきとーに生きている奴の日記

関連記事を探すときは、読んだ記事と同じカテゴリをクリックしてください。

記事のカテゴリは記事タイトル下に表示されています。カテゴリ一覧はサイドバーにあります。


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

Tech Linux Windows 10

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

 

関連エントリ


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

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

 まずはインストール。apy-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