npmでEACCESエラーが発生する
理由とNVMの役割
(Node.js)

  • npmのグローバルインストール時にEACCESエラーが発生するのは、OS標準のNode.jsをそのまま使っていてシステム領域への書き込みができないためです。
  • 通常は、sudoでインストールするのではなく、まずNVMをインストールします。
    NVMを一度インストールしておけば、Node.jsがユーザーのホームディレクトリ以下にインストールでき、npmはsudoなしでグローバルパッケージを扱えるようになります。
  • インストールはcurlでスクリプトを実行するだけで、LTS版のNodeもワンコマンドで導入できます。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
source ~/.bashrc
nvm install --lts
nvm alias default lts/*Code language: PHP (php)

関連記事

1. npmでEACCESエラーが発生する理由

Linux環境で npm install -g を実行したとき、以下のようなアクセスエラーが発生するのは、システム標準のNodeをそのまま使っているからです。

npmでEACCESエラーが発生する理由 問題:EACCESエラー 書き込み権限なし /usr 配下はroot専用 一般ユーザーは書き込み不可 → sudoも非推奨 解決:NVMを使う sudoなしで動作 Node.jsを ~/.nvm に配置 グローバル先もユーザー領域 → 権限エラーなし
npm error code EACCES
npm error Error: EACCCES: permission denied
Code language: JavaScript (javascript)
1. npmでEACCESエラーが発生する理由

開発用途ではNVMをインストールして使うのが定番の構成で、そうすればこのエラーは起きません。npmの公式ドキュメントも、EACCESの解決策としてNVMの使用を第一に推奨しています1

EACCESは「アクセス権限がない」ことを示すエラーです。Node.jsとnpmがOSのパッケージ管理システム(aptなど)によって /usr/bin にインストールされていると、npm install -g はグローバルモジュールディレクトリに書き込もうとします。このパスはディストリビューションによって /usr/lib/node_modules または /usr/local/lib/node_modules になりますが2、いずれも /usr 配下はroot専用領域なので、一般ユーザーには書き込み権限がありません。

sudoを使えばインストールは通りますが、root所有ファイルが混在して権限の不整合が発生します。

1.1. NVMとは何か

そのため、開発用途ではNVMを利用します。
NVMはNode Version Managerの略で、Node.jsのバージョン管理ツールです。

NVMを使うと、Node.jsが /usr ではなく ~/.nvm にインストールされます。npmのグローバルインストール先もユーザー領域になり、sudoが不要になります。Nodeのバージョンをプロジェクトごとに切り替えることもできます。グローバルCLIツールをインストールしても、システム領域に影響しません。NVMはbash・zsh・kshなどPOSIX準拠のシェルであれば動作し、Linux・macOS・Windows(WSL)をサポートしています3

2. NVMのインストール方法

以下はbash環境での手順です。

NVMのインストール方法 1 インストール curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash 2 設定を反映 source ~/.bashrc  ※ zshの場合は ~/.zshrc 3 Node.js LTS をインストールしてデフォルト設定 nvm install –lts  &&  nvm alias default lts/*

2.1. NVMのインストール

記事執筆時点の最新バージョンはv0.40.4です。
インストールスクリプトのURLに含まれるバージョン番号は、公式リポジトリのリリースページで最新版を確認してから実行してください4

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
Code language: JavaScript (javascript)
2.1. NVMのインストール

設定を反映します。

source ~/.bashrc

zshを使っている場合は ~/.bashrc ではなく ~/.zshrc を読み込んでください5

正しくインストールされたか確認します。

command -v nvm

nvm と表示されれば成功です。

2.2. Node.jsをインストール(LTS版)

LTSはLong Term Supportの略で、長期サポートが保証された安定版です。
Node.jsは偶数のメジャーバージョンのみLTS対象となり、リリースから約30ヶ月間サポートが継続されます6

nvm install --lts

デフォルト設定をします。

nvm alias default lts/*
Code language: JavaScript (javascript)

このエイリアスを設定すると、新しいターミナルを開くたびに自動でLTS版が有効になります7

動作を確認します。

which node
npm config get prefix
Code language: JavaScript (javascript)

~/.nvm 配下を指していれば、ユーザー管理のNode環境になっています。

3. パッケージを再インストールするには

NVMをインストールすると、すでにシステム(/usr/lib)にグローバルインストールされていたパッケージが検出されます。

残しておいても動作上の問題はありませんが、NVM管理のNodeからは見えない状態になるので、必要なパッケージはNVM環境に改めてインストールし直すのが整理しやすいです。

3. パッケージを再インストールするには

たとえば、画面には @openai/codexcorepacklighthouse の3つが表示されています。

NVMはこれらを自動で削除せず、消したいなら自分でコマンドを実行する必要があります。

nvm use system      # システムのNodeに切り替える
sudo npm uninstall -g パッケージ名
Code language: PHP (php)
3. パッケージを再インストールするには

nvm use system でいったんシステム側のNodeに戻してから、npm uninstall -g で削除する流れです(このときは管理者権限が必要です)。
終わったら、またnvmを戻して、インストールし直せばよいわけです。

nvm use lts/*
npm install -g パッケージ名Code language: PHP (php)
  1. npmの公式ドキュメント「Resolving EACCES permissions errors when installing packages globally」では、バージョンマネージャを使う方法をベストプラクティスとして挙げています。 – Resolving EACCES permissions errors when installing packages globally
  2. Ubuntuなどのaptベースの環境では /usr/lib/node_modules、macOSやHomebrewベースの環境では /usr/local/lib/node_modules になることが多いです。実際のパスは npm config get prefix で確認できます。 – Error: EACCES: permission denied, access ‘/usr/local/lib/node_modules’
  3. NVMの公式READMEには「nvm works on any POSIX-compliant shell (sh, dash, ksh, zsh, bash), on these platforms: unix, macOS, and windows WSL」と記載されています。 – nvm-sh/nvm
  4. NVMの最新リリースはGitHubのリリースページで確認できます。記事中のv0.39.7より新しいバージョンが公開されている場合は、URLの番号を置き換えてください。 – Releases · nvm-sh/nvm
  5. NVMのインストールスクリプトは、使用しているシェルに応じて ~/.bashrc~/.bash_profile~/.zshrc~/.profile のいずれかを自動で更新します。どのファイルが更新されたかはインストール時の出力メッセージで確認できます。 – nvm-sh/nvm
  6. Node.jsのリリーススケジュールでは、偶数バージョン(20、22、24など)がLTSに昇格し、アクティブサポートが12ヶ月、その後メンテナンスフェーズが18ヶ月続きます。奇数バージョンはLTSにはなりません。現時点の最新LTSはNode.js 24(コードネーム「Krypton」)です。 – Node.js Releases
  7. nvm alias default lts/* を設定しない場合、新規シェルではNVMが読み込まれてもNode.jsのバージョンが自動選択されないことがあります。エイリアスを設定しておくと、毎回 nvm use を実行する手間がなくなります。 – Install Node.js Locally with Node Version Manager (nvm)