Windows に node.js を chocolatey でインストールして gulp を導入する with PowerShell


# 環境

- Windows 7 SP1 Pro x64
- Chocolatey 0.9.9.8
- nodejs 0.12.7
- gulp 3.9.0
- Python 2.7.10
- ユーザ名：Dev

# インストール

chocolatey のインストールから書きます。必要な部分のみ読んでいただければと思います。

## chocolatey のインストール

PowerShell を**管理者権限**で起動し、スクリプト実行ポリシーのチェックを行います。

```ps1
Get-ExecutionPolicy
```

もし実行結果が `Restricted` である場合は以下を実行してください。

```ps1
Set-ExecutionPolicy Unrestricted
```

問題がなければ以下を実行すると chocolatey がインストールされます。

```ps1
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

補足ですが、chocolatey でインストールしたファイルは `choco uninstall` しても残ります。ファイルも消したい場合は以下のコマンドで自動アンインストール機能を有効にしておきます。

```
choco feature enable -n autoUninstaller
```

## node.js のインストール

chocolatey で node.js をインストールします。

```ps1
choco install nodejs -y
```

これで `nodejs 0.12.7` と `nodejs.install 0.12.7` がインストールされます。
ここで一度** PowerShell を再起動**して `node` コマンドを使えるようにします。

※注：筆者は PC を再起動しましたが PowerShell の再起動だけで問題ないはずです。

## npm による gulp のインストール

node.js をインストールすると npm も使えるようになります。
npm は `-g` スイッチが有るとグローバルディレクトリに、無いとカレントディレクトリにモジュールをインストールします。
モジュールのインストール場所は `npm bin` コマンドで表示されます。

```
PS C:\work> npm bin -g
C:\Users\Dev\AppData\Roaming\npm    # グローバルディレクトリ
PS C:\work> npm bin
C:\work\node_modules\.bin           # カレントディレクトリ
```

グローバルディレクトリに gulp をインストールします。

```ps1
npm install -g gulp
```

## Python のインストール

このまま使おうとすると package.json を使った自動インストールなどで Python が無くて怒られる場合があります。

```
gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
```

gyp は Python 2.7 系で動作しますので Python 2.7.x をインストールします。**管理者権限**の PowerShell で以下のコマンドを打ちます。

```ps1
choco install python2 -y
```

インストールされました。

```
PS C:\Users\Dev> python --version
Python 2.7.10
```

# トラブル解析

## トラブルシューティング：PowerShell で gulp を実行出来ない

`node.exe` の無いディレクトリで `gulp` コマンドを実行すると以下のエラーとなり実行できませんでした。
結論を書くと環境変数の誤りでした。おそらく筆者の環境バグで他の人は起こらないかと思います。

```
PS C:\Users\Dev> gulp -v
'node' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

スタートメニューから Node.js command prompt を起動してそこでコマンドを打つと正常に実行されます。

```
C:\Users\Dev>gulp -v
[12:08:47] CLI version 3.9.0
```

PowerShell に戻りカレントディレクトリを `node.exe` のある `C:\Program Files\nodejs` に移動してコマンドを実行すると正常に実行されます。（実行後のテキスト色が白から灰色に変わっていますが…。）

![gulp_with_powershell.png](https://qiita-image-store.s3.amazonaws.com/0/58889/0fc366ef-9f54-2e43-aac2-a08284fae0a4.png)

どうやら環境変数 `PATH` から `node` コマンドをうまく探せていない気がします。確認すると、確かにおかしな行がいくつか見られたのでこれを直します。

直す前（ `;` で改行を、 `#` でコメントを入れています）

```
C:\ProgramData\Oracle\Java\javapath;
C:\Program Files (x86)\Java\jdk1.7.0_55\bin; # 存在しないディレクトリ
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0"; # 下の行と重複かつ末尾に " が付いている
C:\Windows\System32\WindowsPowerShell\v1.0\; # 間違いではないが末尾に \ が付いていて統一されていない 
C:\ProgramData\chocolatey\bin;
C:\Program Files\nodejs\                     # 間違いではないが末尾に \ が付いていて統一されていない
```

直した後（存在しないディレクトリと重複行を削除、末尾の `\` を削除）

```
C:\ProgramData\Oracle\Java\javapath;
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0;
C:\ProgramData\chocolatey\bin;
C:\Program Files\nodejs
```

これで動くようになりました。（色はそのままですが気にしないでおきます。）

![gulp_with_powershell_fix.png](https://qiita-image-store.s3.amazonaws.com/0/58889/1b75d5be-408c-e1f8-5a7f-368b6e2d24a7.png)

## トラブルシューティング：fsevents でエラーが表示される

`npm install` でパッケージをまとめてインストールしようとしたとき、以下のようなエラーが表示されました。[調べると](http://stackoverflow.com/questions/31228862/npm-warn-optional-dep-failed-continuing-fsevents0-3-6) Mac OS X 向けの API を叩いているところで発生する警告だそうで、特に問題はなさそうです。

```
npm WARN optional dep failed, continuing fsevents@0.3.6
npm WARN optional dep failed, continuing fsevents@0.3.6
```

## トラブルシューティング：utf-8-validate がビルドできない（未解決）

**この問題は解決していません**

パッケージによっては VCBuild.exe （Visual C++ のビルダー）が必要になることがあります。ログを見る限り `browser-sync` の依存関係パッケージ `utf-8-validate` で `node-gyp rebuild` が走行した後に発生しているようです。
なお、 `utf-8-validate` のビルドが失敗しても `browser-sync` は動作するようです。

エラー表示例

```
MSBUILD : error MSB3428: Visual C++ コンポーネント "VCBuild.exe" を読み込めませんでした。この問題を解決するには、次のいずれかを行ってください。
1) .NET Framework 2.0 SDK インストールする。
2) Microsoft Visual Studio 2005 をインストールする。
3) その他の場所にインストールされている場合、コンポーネントの場所をシステム パスに追加する。
...
gyp ERR! build error
gyp ERR! stack Error: `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe` failed with exit code: 1
...
```

- 参考：[using latest npm not working #1](https://github.com/websockets/utf-8-validate/issues/1)
  - 類似の問題のリンク先に「最新の node をインストールしたら直った」とあります。今回は最新版でしたが、ダメなようです。
- 参考：[【解決済】Windows7でnpm install実行時にエラー](http://blue-goheimochi.hatenablog.com/entry/2015/02/27/%E3%80%90%E8%A7%A3%E6%B1%BA%E6%B8%88%E3%80%91Windows7%E3%81%A7npm_install%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC)
  - VS Community が発表された今、VS 2012 を今更インストール気はないです…。

### .NET Framework 2.0 SDK インストールする（失敗）

表示に従って .NET Framework 2.0 SDK インストールしました。

- ダウンロード：[Microsoft .NET Framework 2.0 SDK 日本語版 (x86)](http://www.microsoft.com/ja-jp/download/details.aspx?id=19988)

`setup.exe` を実行してデフォルト設定のままインストールしました。

再び PowerShell に戻り以下を実行します。

```
cd "C:\Program Files (x86)\Microsoft.NET\SDK\v2.0\Bin"
.\sdkvars.bat
# 実行結果出力：
# Setting environment to use Microsoft .NET Framework v2.0 SDK tools.
# For a list of SDK tools, see the 'StartTools.htm' file in the bin folder.
```

ビルドします。

```
npm install
(略)
MSBUILD : error MSB3428: Visual C++ コンポーネント "VCBuild.exe" を読み込めませんでした。この問題を解決するには、次のいずれかを行ってください。
```

ダメでした。

コマンドプロンプトでは？と思ってスタートメニューのSDK コマンド プロンプトから実行同様に実行しました。結果、ビルドに進むようになりましたがライブラリのファイルが足りずに失敗しています。

```
ターゲット ValidateSolutionConfiguration:
    ソリューション構成 "Release|x64" をビルドしています。
ターゲット Build:
    ターゲット validation:
        VCBuild.exe C:\work\node_modules\browser-sync\node_modules\socket.io\node_modules\socket.io-client\node_modules\engine.io-client\node_modules\ws\node_modules\utf-8-validate\build\validation.vcproj "Release|x64"
        c:\users\dev\.node-gyp\0.12.7\deps\uv\include\uv-win.h(32): fatal error C1083: include ファイルを開けません。'winsock2.h': No such file or directory
    プロジェクト "binding.sln" 内のターゲット "validation" のビルドが終了しました。 -- 失敗
プロジェクト "binding.sln" 内のターゲット "Build" のビルドが終了しました。 -- 失敗

プロジェクト "binding.sln" のビルドが終了しました。 -- 失敗
```

### Microsoft Windows SDK for Windows 7 and .NET Framework 4（失敗）

Microsoft Windows SDK for Windows 7 and .NET Framework 4 を入れてみました。これも chocolatey でインストールできます。

```
choco install windows-sdk-7.1 -y
```

なお Windows 8.1 をお使いの方は `windows-sdk-8.1` の方を導入することになると思います。

しかし、こちらは環境変数がらみでビルドに失敗しているようです。

```
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(297,5): warning MSB8003: Could not find WindowsSDKDir variable from the registry.  TargetFrameworkVersion or PlatformToolset may be set to an invalid version number. [C:\work\node_modules\browser-sync\node_modules\socket.io\node_modules\socket.io-client\node_modules\engine.io-client\node_modules\ws\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\Microsoft.Cpp.x64.Targets(146,5): error MSB6006: "CL.exe" はコード -1073741515 を伴って終了しました。 [C:\work\node_modules\browser-sync\node_modules\socket.io\node_modules\socket.io-client\node_modules\engine.io-client\node_modules\ws\node_modules\bufferutil\build\bufferutil.vcxproj]
```

後始末は冒頭の自動アンインストール機能を有効にしていると楽です。

```
choco uninstall windows-sdk-7.1
choco uninstall 7zip               # windows-sdk-7.1 の依存関係でインストールされます
```