macで npm install -g しようとすると出るエラーをnvmで解決する
はじめに
macでNode.jsのダウンロードページからNode.jsインストール後に npm install -g をしようとするとパーミッションエラーが出る(エラー内容は後述)。
これに対してnpm公式は「nvmを使ってnpmを再インストールするのを推奨」(意訳)と言っている。
エラーの解消方法について調べると 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公式に書いてある方法でインストールする。
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やらは依存関係がややこしくてハマりやすい気がするので気軽にログを残していきたい所存。
参考
Discussion