npmのアップデート(npm install -g npm)をしてもバージョンが変わらない場合の解決例

以下のような状況に遭遇したものの、ネット上に似たような事例はあっても解決に至るものがなかったので一例として残しておきます。

1. npmを使用中にバージョンアップするようにメッセージが出たので、言われた通り`npm install -g npm`を実行。
2. 画面上は問題なくアップデートが終了したように見えたのだが、その後再びメッセージが表示される。
2. `npm -v`でバージョンを確認すると確かにバージョンが低いままだったので再度`npm install -g npm`を実行。
2. 問題なくアップデートが済んだので`npm -v`をするとバージョンが変わっていなかった。

結論としては、HomebrewとNodebrewの双方でNode.jsをインストールしており、`/usr/local/bin/`にnpmファイルが残っていたことが原因だったようです。
NodeはNodebrewを、npmはHomebrewにあったものにパスが通っていたため、Nodebrew管理のnpmは問題なくアップデートされているのに、コマンドに使用されるのはHomebrewのnpm、という事態に落ち入っていました。

## 環境
MacBook Pro (15-inch, 2019)
macOS Big Sur バージョン11.2.1

## 調査記録
### 原因調査
ログが残っていなかったのですが、`npm v6.13.4`から`npm v7.14.0`にするのが今回の目標です。

まずは実行されているファイルの確認をします。
ちなみに、Nodeのインストールと共にnpmがインストールされ、npmがインストールされるとnpxもインストールされるということで、npxについてもnpm同様に調査していきます。

[npmとnpx。なにが違う？](npmとnpx。なにが違う？)
>npmのバージョン5.2.0以降はnpxがプリインストールされているそう。

```zsh:zsh
$  npm -v
6.13.4

$  npx -v
6.13.4

$  which node
/Users/your_name/.nodebrew/current/bin/node

$  which npm
/usr/local/bin/npm

$  which npx
/usr/local/bin/npm
```

パスの通っている場所が違うので調べてみたところ、HomebrewとNodebrewどちらにもNode.jsがインストールされていました。

```zsh:zsh
$  brew list node
/usr/local/Cellar/node/13.11.0/bin/node
/usr/local/Cellar/node/13.11.0/etc/bash_completion.d/npm
/usr/local/Cellar/node/13.11.0/include/node/ (136 files)
/usr/local/Cellar/node/13.11.0/lib/dtrace/node.d

$  nodebrew list node
v12.16.0

current: v12.16.0
```

NodeだけNodebrew管理のものが参照されていたのは、環境変数として記述していたからのようです。
同じような状況で、`.bashrc~/`、 `.bash_profile`、 `.zshrc`、 `.zshenv` などに追記した覚えのある方は確認してみてください。
`ls -a ~/` と実行すればファイルの有無は確認できます。

```zsh:zsh
$  vim ~/.zshenv

# node
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

### Homebrew管理のNode.jsをアンインストール
ルートディレクトリ直下にあるファイルは怖いのであまり触りたくないのですが、Homebrew管理のものであれば再インストールも可能なので大丈夫だろうと考えアンインストールを実行します。

```zsh:zsh
$  brew uninstall node
Error: Refusing to uninstall /usr/local/Cellar/node/13.11.0
because it is required by yarn, which is currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies node
```

nodeの依存関係にyarnがあるのでアンインストールができないと表示されました。
`brew uninstall --ignore-dependencies node`で強制実行も出来ると提案されていますが、訳もわからず強制実行して良い結果になった試しがないのでyarnについて調べます。

[yarn公式](https://classic.yarnpkg.com/en/docs/install#mac-stable)
>It is recommended to install Yarn through the npm package manager, which comes bundled with Node.js when you install it on your system.


インストールした時のことは覚えていませんが、調べたところどうやらyarnはnpmからのインストールを推奨しているようなので、アンインストールしてもNodebrew管理のnpmで簡単に再インストールできそうだという判断でアンインストールを実行します。
ちなみに今回の場合はHomebrewからインストールしていたようです。
Nodeも複数バージョンインストールされていたようなので、指示通りのコマンドで全てアンインストールします。

```zsh:zsh
$  brew list yarn
/usr/local/Cellar/yarn/1.22.4/bin/yarn
/usr/local/Cellar/yarn/1.22.4/bin/yarnpkg
/usr/local/Cellar/yarn/1.22.4/libexec/bin/ (5 files)
/usr/local/Cellar/yarn/1.22.4/libexec/lib/ (2 files)
/usr/local/Cellar/yarn/1.22.4/libexec/package.json

$  brew uninstall yarn
Uninstalling /usr/local/Cellar/yarn/1.22.4... (14 files, 5MB)
/Users/wm/Desktop/gulp_with_jekyll_test

$  which yarn
yarn not found

$  brew uninstall node
Uninstalling /usr/local/Cellar/node/13.11.0... (4,686 files, 60.4MB)
node 13.10.1 and 13.8.0 are still installed.
Run `brew uninstall --force node` to remove all versions.
/Users/wm/Desktop/gulp_with_jekyll_test

$  brew uninstall --force node
Uninstalling node... (9,372 files, 120.6MB)
```

### Nodebrew管理への移行

アンインストールは問題なく行われたので、再度実行される場所を調べるも変化がありませんでした。

```zsh:zsh
$  which npm
/usr/local/bin/npm

$  which npx
/usr/local/bin/npx
```

該当ディレクトリを見ると、`.npm`、 `.npx`というファイルがあったため、別の場所へ移して再度確認をします。
（今回の場合はデスクトップへ移動させました）

```zsh:zsh
$  which npm
/Users/wm/.nodebrew/current/bin/npm

$  which npx
/Users/wm/.nodebrew/current/bin/npx

$  npm -v
7.14.0

$  npx -v
7.14.0
```

ちゃんとNodebrewのものを参照してくれたようです。
ここまで確認できれば、先ほど移動させた`.npm`、 `.npx`のファイルは削除して大丈夫だと思います。
仕上げに、先ほどアンインストールしたyarnをインストールしなおします。

```zsh:zsh
$  npm install -g yarn

> yarn@1.22.10 preinstall /Users/your_name/.nodebrew/node/v12.16.0/lib/node_modules/yarn
> :; (node ./preinstall.js > /dev/null 2>&1 || true)

/Users/your_name/.nodebrew/node/v12.16.0/bin/yarn -> /Users/your_name/.nodebrew/node/v12.16.0/lib/node_modules/yarn/bin/yarn.js
/Users/your_name/.nodebrew/node/v12.16.0/bin/yarnpkg -> /Users/your_name/.nodebrew/node/v12.16.0/lib/node_modules/yarn/bin/yarn.js
+ yarn@1.22.10
added 1 package in 0.959s

$  which yarn
/Users/your_name/.nodebrew/current/bin/yarn
```

無事に全てNodebrew管理となりました。
お疲れ様でした。

## 後書き
とても久しぶりに環境構築系の問題にぶち当たったのですが、丁寧に調べたところ、スムーズに解決することができました。
一年位前は色々な記事に書いてあることを手当たり次第に試し、カオスな状況を作り出しては反省していたので、その経験を生かせたように思います。
せっかく情報の溢れた時代を生きているのですから、分からないことは理解するまでしっかりと調べるべきですね。
この記事もどなたかの参考になっていれば嬉しく思います。

## 参考
[nodebrewでNode.jsをインストールする。](https://qiita.com/yukibe/items/bae442fa6314bd8f9d7a)