npm installできないときの解決策③（Stack Trace）

# 1. 問題
[npm installできないときの解決策②（ChatGPT）](https://qiita.com/Mihamakun/items/3ac5692fd317aaeb28e5)の続き。
ChatGPTに聞いて何となく`bcrypt`と`fsevents`にインストールエラーが起きていることが分かった。解決策も教わった。
でも、自分自身で把握＆解決してみたい。

# 2. 環境
node 14
npm 6.14.4
Windows 10

# 3. 解決
`Stack Trace`を読めばエラーの原因が特定できる。
今回のエラーの場合、`bcrypt`と`fsevents`のDependencyエラーが原因だった。
`bcrypt`はその問題を解決したバージョンにアップデートして（5.1.1）、`fsevents`はWindows 10環境に要らないのでエラーが出ても無視することにした。

# 4. 詳細
以下はStack Traceに基づいてエラーの原因と解決策を見つけ出す手順である。

## 4.1 Stack Traceを見てエラーの原因を特定
 [エラー本文](https://qiita.com/Mihamakun/items/3ac5692fd317aaeb28e5#1-問題)を「stack」文字列を中心に読んでみると、以下のことが分かる。
- `fsevents`をインストールしようとしたら、`node-gyp`にエラーが起きた。
- `bcrypt`をインストールしようとしたら、`node-pre-gyp`と`node-gyp`にエラーが起きた。

## 4.2 追加調査
どうやらDependencyのエラーが原因のようだ。
本当にそういう依存関係なのか？パッケージを作った人もこのイシューを知っているのか？調べてみる。

### 4.2.1 npm list
npm listして、fseventsとbcryptのDependencyを確認する。
fseventsがnode-pre-gypに依存していることが分かる。

:::note alert
解決後の照会結果なので、bcryptがnode-pre-gypを依存していることは見えない。
:::

```terminal
$ npm list node-pre-gyp
nodebird@0.0.1 C:\Users\ivego\pj\nodebird
`-- nunjucks@3.2.0
  `-- chokidar@2.1.8
    `-- UNMET OPTIONAL DEPENDENCY fsevents@1.2.11       
      `-- UNMET OPTIONAL DEPENDENCY node-pre-gyp@0.14.0
```

### 4.2.2 公式文書を確認
`fsevents`と`bcrypt`の公式文書に`node-gyp`や`node-pre-gyp`について書いてないか確認する。

#### 4.2.2.1 fsevents
言及無し。

#### 4.2.2.2 bcrypt
:::note info
node-gyp only works with stable/released versions of node. Since the bcrypt module uses node-gyp to build and install, you'll need a stable version of node to use bcrypt. If you do not, you'll likely see an error that starts with:

gyp ERR! stack Error: "pre" versions of node cannot be installed, use the --nodedir flag instead
:::

:::note info
If you face an error like this:

node-pre-gyp ERR! Tried to download(404): https://github.com/kelektiv/node.bcrypt.js/releases/download/v1.0.2/bcrypt_lib-v1.0.2-node-v48-linux-x64.tar.gz
make sure you have the appropriate dependencies installed and configured for your platform. You can find installation instructions for the dependencies for some common platforms in this page.
:::

## 4.2 解決策の予想
fseventsとbcryptはnode-gypとnode-pre-gypに依存している。
でもnode-gypとnode-pre-gypに何か不具合があってfseventsとbcryptがインストールできない状態。
だからnode-gypとnode-pre-gypのエラーを直すか、依存パッケージのエラーが解決したfseventsとbcryptのバージョンを使用すればいいのでは。

## 4.3 解決策の検索
`fsevents`、`bcrypt`、`node-pre-gyp`、`node-gyp`のキーワードでググってみると、様々な解決策が出てくる。

- 依存パッケージのエラー修正
  - node-pre-gypを直接インストール。
  - node-gypが依存するPythonとVisual Studio build toolsをSettingする。
  - node-gypのグローバルインストール。<br/><br/>

- インストールできないパッケージのアップデート・差し替え・使用中止
  - bcryptの代わりに、node-pre-gyp問題がないというbcryptjsを使用。
  - fseventsはMac OS用なので、使用しない。
  - node-pre-gyp問題が解決したというbcrypt 5.1.0を使用。<br/><br/>
   
## 4.4 解決策の選択・適用
本人の状況に合う解決策を選ぶ。
今回は「`bcrypt`はその問題を解決したバージョン以上にアップデート（5.1.1）。`fsevents`はWindows 10環境に要らないのでエラーが出ても無視」することにした。
そもそも[対象のプロジェクト](https://github.com/ZeroCho/nodejs-book/tree/2pan/ch16/16.5/nodebird)を実行しようとする目的は、それの`MVC`構造を見ること以外ないので。

# 5. 次の記事
なし。

# 6. まとめ
npmインストールできないとき、エラー文をStack Traceを中心に読めばエラーの原因が分かる。
Dependencyエラーの場合、npm listで依存関係を調べたり、当該パッケージの公式文書に何か手掛かりはないか読んでみたりしてさらに調査してみるといい。
解決策をまず自分でざっと予想してみる。その後解決策をググる。
解決策が複数ある場合、自分の目的に合うのを選ぶ。

# 7. 感じたこと
Dependency自体のエラーを直す方が勉強にもっと役立つのでは、と思ったけど、そうすると時間がかかりすぎてやめた。社会人の勉強時間は大事。
でもいつの日かやってみたい。

# 8. 参考
- bcryptjs
  - [npm install error](https://www.inflearn.com/questions/176940/npm-install-error)
  - [Error installing bcrypt with npm](https://stackoverflow.com/questions/29320201/error-installing-bcrypt-with-npm)<br/><br/>

- bcrypt 5.1.0
  - [npm ERR! bcrypt@5.0.1 install: node-pre-gyp install --fallback-to-build](https://github.com/kelektiv/node.bcrypt.js/issues/875)<br/><br/>

- node-gypはpythonとvisual studio build toolのSetting
  - [[React] npm installするときnode-gypエラー]()<!--[React] npm install시 node-gyp 에러-->
  - [node-gyp rebuild error (window)](https://24hours-beginner.tistory.com/18#2._cmd나_powershell_를_"관리자_모드"_연_후_아래_명령어_두줄을_실행_한다)
  - [Windows10でnpm install bcryptをした際に発生するnode-gypのエラーを回避する方法](https://moeruze.hatenablog.com/entry/2016/09/13/203105)<br/><br/>

- node-gypのグローバルインストール
  - [npm install fibers shows error](https://stackoverflow.com/questions/24649549/npm-install-fibers-shows-error)<br/><br/>

- bcrypt
  - [bcrypt](https://www.npmjs.com/package/bcrypt)<br/><br/>

- fsevents
  - [fsevents](https://www.npmjs.com/package/fsevents)