学問に王道なし

書山有路勤為径  学海無涯苦作舟

学問に王道なし

書山有路勤為径  学海無涯苦作舟

MacにてNodeを構築してみた

初めに

Mac環境にて、NodeJSを構築したことない為、
やってみようかなと思った。

簡単設計

MacBook Proは私用のやつなので、プラベートアカウントも使っている。
そこでファイアウォールやVirus対策ソフトいっさい入っていない為、攻撃されても気づかない。
そのリンクを考えた上で、仮想マシンを構築して対応するようにする。

環境構築

Vagrant

Vagrant by HashiCorp へアクセスし、DMGファイルをダウンロードしてインストールする。
結局仮想マシンののプロバイダもいる為、virtualboxも一緒にインストールする。
Downloads – Oracle VM VirtualBox

とりあえず下記のページ通りに、ターミナルで下記のコマンドを叩く

vagrant init centos/7
vagrant up 

が、下記のエラーが出ていた。

Stderr: VBoxManage: error: The virtual machine 'zhangnan_default_1523764035777_67688' has terminated unexpectedly during startup with exit code 1 (0x1)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine

調べてみると、MacOSのセキュリティー制限により、カーネルがブロックされたようだね。。
high sierra - VirtualBox 5.1.8 installation didn't install kernel extensions. How do I fix this? [macOS 10.13] - Ask Different
https://blog.keinos.com/20180204_3232

記事の通りにやってみた結果、問題なく起動できた。
f:id:zhangnan198711:20180415134217p:plain

そしてSSHしてみたら

choukusunokinoMacBook-puro:~ zhangnan$ vagrant ssh default
[vagrant@localhost ~]$ 

無事にログインできた!

NodeJS

下記のページをベースにして、インストールする
Installing Node.js via package manager | Node.js
バージョンについて、LTSはNodeJS8だが、最新版で良い為、NodeJS 9 にいく

# ソースlocation指定
curl --silent --location https://rpm.nodesource.com/setup_9.x | sudo bash -

# yum
sudo yum -y install nodejs
sudo yum install gcc-c++ make

そして試してやってみると、
f:id:zhangnan198711:20180415141414p:plain
うまく行った。

Express - Helloworld!

まずはフォルダを作成する

[vagrant@localhost ~]$ mkdir myapp
[vagrant@localhost ~]$ cd myapp/

そしてnpmで初期化

[vagrant@localhost myapp]$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (myapp) myapp
version: (1.0.0) 
description: Test App
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: ZHang
license: (ISC) 
About to write to /home/vagrant/myapp/package.json:

{
  "name": "myapp",
  "version": "1.0.0",
  "description": "Test App",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "ZHang",
  "license": "ISC"
}


Is this ok? (yes) 

いろんなのパラメータが聞かれた為、とりあえず規定値でいく
ここでyesをして、初期化が完了した。

そして、expressをインストール

npm install express --save

...が失敗した!

[vagrant@localhost myapp]$ npm install express --save
Unhandled rejection Error: ENOSPC: no space left on device, open '/home/vagrant/.npm/_cacache/tmp/56b3b56a'

Unhandled rejection Error: ENOSPC: no space left on device, open '/home/vagrant/.npm/_cacache/tmp/91ff8c38'

あれ?

[vagrant@localhost myapp]$ df -ah .
Filesystem                       Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00   38G   38G   60K 100% /

100%?!
調べてみると、vagrantは暗黙でmacのユーザーフォルダから、仮想マシンrsyncしてくれている。。。
これって、38GBでも足りないぞ...

そしてこの感じで設定変更し、スペースを解放して再installすれば
Disabling Default Rsync Of The Vagrant Docker Provider | WizOne Solutions

[vagrant@localhost myapp]$ npm install express --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN myapp@1.0.0 No repository field.

+ express@4.16.3
added 50 packages in 2.108s

成功!

じゃサクッと、

[vagrant@localhost myapp]$ cat index.js 
var express = require('express');
var app = express();
app.get('/', function (req, res) {
  res.send('Hello World!');
});
app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

index.jsを作成してみた。

それで、Helloworldができたはずだ。

[vagrant@localhost myapp]$ node index.js
Example app listening on port 3000!

けど、Macからアクセスできないでは??
そしてVagrantの設定ファイル*1にて、ポートマッピングを追加

config.vm.network "forwarded_port", guest: 3000, host: 1234

そしてhost側で

choukusunokinoMacBook-puro:Applications zhangnan$ vagrant reload

guest側にsshして、再起動してみ

choukusunokinoMacBook-puro:~ zhangnan$ vagrant ssh default
Last login: Sun Apr 15 05:36:57 2018 from 10.0.2.2
[vagrant@localhost ~]$ cd myapp/

[vagrant@localhost myapp]$ ll
total 28
-rw-rw-r--.  1 vagrant vagrant   211 Apr 15 05:47 index.js
drwxrwxr-x. 50 vagrant vagrant  4096 Apr 15 05:46 node_modules
-rw-rw-r--.  1 vagrant vagrant 13423 Apr 15 05:46 package-lock.json
-rw-rw-r--.  1 vagrant vagrant   264 Apr 15 05:46 package.json
[vagrant@localhost myapp]$ node index.js 
Example app listening on port 3000!

そーしーて
f:id:zhangnan198711:20180415145911p:plain

Job Done.

*1:一番最初に起動した際に、Vagrantfileという名前のファイルが同じフォルダにて作成されたはず