npm のグローバルインストールに失敗したら

macOS Mojave 環境にて。この前久々に npm パッケージをグローバルインストールしようとしたら、以下のようなエラーが出た。

$ npm install -g @neos21/neos21
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules']
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

# コンソールがこのまま止まってしまったので Control + C で終了させた

はて、グローバルインストール先の /usr/local/lib/node_modules/ に書き込み権限がないとな。

グローバルの npm 関連のディレクトリは、以下のように調べられる。

$ npm config get prefix
/usr/local

$ npm root -g
/usr/local/lib/node_modules

$ npm bin -g
/usr/local/bin

コレでいくと、今回問題になっているのは $ npm root -g コマンドで取れるパスのディレクトリなので、ココの権限をチェックしてみる。

$ ls -l /usr/local/lib
  # 途中省略
drwxr-xr-x   3 toor        admin       96  7 23 16:21 node_modules
drwxrwxr-x  79 Neos21      admin     2528 11 21 14:40 pkgconfig

おや、node_modules/ ディレクトリの所有者が違うわい。

ということで、以下のコマンドを叩いて解決。

$ sudo chown -R $(whoami) $(npm root -g)

# コマンドを使わないで書いたとしたらこんな感じ
$ sudo chown -R Neos21 /usr/local/lib/node_modules

コレでグローバルインストールできるようになった。