📝

macで npm install -g しようとすると出るエラーをnvmで解決する

に公開

はじめに

macでNode.jsのダウンロードページからNode.jsインストール後に npm install -g をしようとするとパーミッションエラーが出る(エラー内容は後述)。

これに対してnpm公式は「nvmを使ってnpmを再インストールするのを推奨」(意訳)と言っている。

https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally

エラーの解消方法について調べると sudo を使ったり /usr/local/lib/node_modules 以下のディレクトリの権限を変えたりする方法は出てくるが、nvmでのnpm再インストールによって解消する方法はあまり出てこないので書き留めておく。

問題

npm install -g [パッケージ名]

これを実行すると下記エラーが出る。

実行結果
実行結果
npm error code EACCES
npm error syscall mkdir
npm error path /usr/local/lib/node_modules/[パッケージ名]
npm error errno -13
npm error Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/[パッケージ名]'
npm error     at async mkdir (node:internal/fs/promises:858:10)
npm error     at async /usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:624:20
npm error     at async Promise.allSettled (index 0)
npm error     at async [reifyPackages] (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:325:11)
npm error     at async Arborist.reify (/usr/local/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/reify.js:142:5)
npm error     at async Install.exec (/usr/local/lib/node_modules/npm/lib/commands/install.js:150:5)
npm error     at async Npm.exec (/usr/local/lib/node_modules/npm/lib/npm.js:207:9)
npm error     at async module.exports (/usr/local/lib/node_modules/npm/lib/cli/entry.js:74:5) {
npm error   errno: -13,
npm error   code: 'EACCES',
npm error   syscall: 'mkdir',
npm error   path: '/usr/local/lib/node_modules/[パッケージ名]'
npm error }
npm error
npm error The operation was rejected by your operating system.
npm error It is likely you do not have the permissions to access this file as the current user
npm error
npm error If you believe this might be a permissions issue, please double-check the
npm error permissions of the file and its containing directories, or try running
npm error the command again as root/Administrator.

解決方法

1. nvmをインストールする

nvm公式に書いてある方法でインストールする。
https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

2. ターミナルを再起動し、nvmのインストールを確認

source ~/.zshrc
nvm -v

これでバージョンが出力されればインストールは問題なし。

3. 現在インストールされているNode.jsの確認

現在インストールされているNode.jsのバージョンを確認。

nvm current
出力結果
system

続いて現在nvmで切り替え可能なバージョンを確認。

nvm ls
出力結果
->       system
iojs -> N/A (default)
node -> stable (-> N/A) (default)
unstable -> N/A (default)

これらから既にインストール済みのNode.jsはnvm管理下になくシステムにインストールされていることがわかる。
ここにnvm管理下のNodeバージョンを追加していき、nvmで切り替えができるようにする。

4. nvmで新しいNode.jsをインストール

下記コマンドでLTS(Long Term Support)版のNode.jsバージョンをインストールできる

nvm install --lts

インストール後に現在参照しているバージョンを確認。

nvm current
出力結果
v22.18.0

system から v22.18.0 に切り替わっている。
念の為nvm管理下のバージョン一覧も確認。

nvm ls
出力結果
->     v22.18.0
         system
default -> lts/* (-> v22.18.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v22.18.0) (default)
stable -> 22.18 (-> v22.18.0) (default)
lts/* -> lts/jod (-> v22.18.0)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12 (-> N/A)
lts/fermium -> v14.21.3 (-> N/A)
lts/gallium -> v16.20.2 (-> N/A)
lts/hydrogen -> v18.20.8 (-> N/A)
lts/iron -> v20.19.4 (-> N/A)
lts/jod -> v22.18.0

こちらもバージョンが追加され切り替わっている。

5. 改めてnpm install -gしてみる

冒頭でエラーが出た下記コマンドを再実行してみる。

npm install -g [パッケージ名]

細かい実行結果は省略するが下記のような記述が出力され、無事インストールが完了した模様。

実行結果
added 715 packages in 32s

おわりに

上記では省略したが、 firebase-tools をインストールしようとした過程でこのエラーに遭遇した。
個人的にnvmやらnpmやらは依存関係がややこしくてハマりやすい気がするので気軽にログを残していきたい所存。

参考

https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally

https://github.com/nvm-sh/nvm?tab=readme-ov-file#installing-and-updating

Discussion