2024年3月4日月曜日

ubuntu22.04で最新のnpmを使おうとしたら発生したsemver関係の不具合はhash -rコマンドで直る場合がある


問題解決のためにこの記事にたどり着いた方は、下記のコマンドを実行してnpmを再実行してみてください。
harh -r

背景

ubuntu22.04で最新のnpmを使おうとnコマンドを利用して更新したところ、semverが見つからないというエラーが発生して動かなくなりました。
試行錯誤したところ、nコマンド実行後に表示されるhashコマンドを実行すると直りました。
備忘録として関連情報を記事に残します。

利用環境

ubuntu22.04

hash更新コマンドを実行しないと発生した不具合

npmコマンドを実行すると下記のようなエラーが発生して困りました。
node:internal/modules/cjs/loader:1144
const err = new Error(message);
^

Error: Cannot find module 'semver'
Require stack:
- /usr/share/nodejs/npm/lib/utils/unsupported.js
- /usr/share/nodejs/npm/lib/cli.js
- /usr/share/nodejs/npm/bin/npm-cli.js
at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)
at Module._load (node:internal/modules/cjs/loader:985:27)
at Module.require (node:internal/modules/cjs/loader:1235:19)
at require (node:internal/modules/helpers:176:18)
at Object.<anonymous> (/usr/share/nodejs/npm/lib/utils/unsupported.js:2:16)
at Module._compile (node:internal/modules/cjs/loader:1376:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
at Module.load (node:internal/modules/cjs/loader:1207:32)
at Module._load (node:internal/modules/cjs/loader:1023:12)
at Module.require (node:internal/modules/cjs/loader:1235:19) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/usr/share/nodejs/npm/lib/utils/unsupported.js',
'/usr/share/nodejs/npm/lib/cli.js',
'/usr/share/nodejs/npm/bin/npm-cli.js'
]
}

Node.js v20.11.1

最新のnpmをインストールするコマンド

下記のコマンドでubuntuのnpmを最新にしました。
nodejsのページからtarをダウンロードする方法もありますが、自分はaptでダウンロードしたnpmでnをインストールし、そのnで最新版に更新しました。
sudo apt install -y npm
sudo npm install -g n
sudo n stable
hash -r

上記の最後のhashコマンドが重要です。
nでnode環境を更新すると下記の情報が表示されたのでそれに従いました。
Note: the node command changed location and the old location may be remembered in your current shell.
old : /usr/bin/node
new : /usr/local/bin/node
If "node --version" shows the old version then start a new shell, or reset the location hash with:
hash -r (for bash, zsh, ash, dash, and ksh)
rehash (for csh and tcsh)

自分はbash環境を使っているので「hash -r」を実行しましたが、cshやtcshを利用している方は「rehadh」を実行してください。

余談: npm全消し(アンインストール)コマンド

試行錯誤のときにnode環境を全消ししてインストールし直すのを繰り返した際に実施した全消しコマンドです。
sudo apt purge -y nodejs npm
sudo apt autoremove -y
sudo rm -rf /usr/local/bin/npm /usr/local/share/man/man1/node* ~/.npm
sudo rm -rf /usr/local/lib/node*
sudo rm -rf /usr/local/bin/node*
sudo rm -rf /usr/local/include/node*
sudo rm -rf ~/.npm

この後aptでnpmをインストールすると、古いnpmが実行可能な環境に戻ります。

おわり

nコマンドを実行するとnpmが壊れて戸惑いましたが、「hash -r」(もしくは「rehash」)コマンドを実行すれば直ると分かって良かったです。

参考

npmが動かない(Cannot find module 'semver')
Npm can't find module "semver" error in Ubuntu 19.04

0 件のコメント :