カテゴリー
未分類

sudo npm install -g xxx コマンド の、 ‘sudo’ は、推奨されないようです。[2019]

Vue CLI のインストールAngular CLI のインストール方法は、それぞれの公式サイトで、以下のようなコマンドが紹介されています。

npm install -g @vue/cli
npm install -g @angular/cli

ところが、実際に上記のコマンドを実行してみると、Error: EACCES: permission denied, access '/usr/local/lib/node_modules' が発生しました。

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).

様々なネットの情報を調べると、sudo コマンド を使えば、ひとまずは解消するようです。

sudo npm install -g @vue/cli

しかしながら、エラーメッセージの末尾には、以下の表記がありました。

the command again as root/Administrator (though this is not recommended).

root もしくは Administrator として、コマンドを再実行してみてください(とはいえ、これはお勧めしません。)

どうやら、 npm の開発チームとしては、 sudo コマンドを使うことは、本望ではないようです。

では、どういった形が理想なのでしょう。

Node.js 公式サイトのインストーラはオススメされない

npmのドキュメントサイトを探した結果、以下の記述を発見しました。

We do not recommend using a Node installer, since the Node installation process installs npm in a directory with local permissions and can cause permissions errors when you run npm packages globally.

Node インストールプロセスはローカルのパーミッションを持つディレクトリに npm をインストールし、あなたがグローバルに npm パッケージを実行するとパーミッションエラーを引き起こす可能性があるので、 Node インストーラを使うことはお勧めしません。

https://docs.npmjs.com/downloading-and-installing-node-js-and-npm

Node.js 公式サイトでは、Node インストーラがダウンロードできます。

(ちなみに、Node.js 公式サイトnpm の公式サイトは、それぞれ別のサイトです。)

このインストーラは、 node コマンドに加え、 npm コマンドも一緒にインストールしてくれます。

ただ、この npm コマンドのインストール先が問題で、デフォルトのままでは、 `npm install -g` コマンドを使うたびに、パーミッションエラーが起こります。

私の環境も、Node インストーラを使って構築したものだったので、この現象が起きていました。

この問題を防ぐためには、sudoコマンドを使うのではなく、Node インストーラを使うこと自体をお勧めしない、というのが、npm の 公式サイトの見解のようです。

では、何を使ってインストールするのが、npmのオススメなのでしょうか。

Node バージョンマネージャ を使ってNode.js をインストールする

先述のドキュメント に、(太字で)以下の記述があります。

 you must install Node.js and the npm command line interface using either a Node version manager or a Node installer. We strongly recommend using a Node version manager to install Node.js and npm.

Nodeバージョンマネージャか、Nodeインストーラのどちらかを使用して、Node.jsとnpmコマンドラインインタフェースをインストールする必要があります。 Node.jsとnpmをインストールするには、Nodeバージョンマネージャを使用することを強く推奨します。

https://docs.npmjs.com/downloading-and-installing-node-js-and-npm

Node.js と npm のセットをインストールする方法は、いくつかあります。

ひとつは、先述の Node インストーラを使う方法ですが、これはnpmチームはオススメしていません。

もう一つのインストール方法は Node バージョンマネージャを使う方法です。

では、 Node バージョンマネージャとは何でしょうか。

Node バージョンマネージャ

Node バージョンマネージャは、一つのコンピュータに、様々なバージョンのNode.jsを複数インストールできるようにしてくれるソフトです。

例えば、 v10.15.3 と v12.1.0 という、二つのバージョンをインストールして、必要に応じて両者を切り替えて使う、ということが可能となります。

このように、もともとは複数バージョンの切り替えを目的としたソフトなのですが、Node バージョンマネージャを使うメリットはもう一つあります。

Node バージョンマネージャは、npmコマンドを、特別なパーミッションを必要としないフォルダにインストールしてくれます。

これにより、sudo を使うことなく、 npm install -g コマンドが使えるようになります。

Node バージョンマネージャ、どれをインストールする?

実は、「Node バージョンマネージャをインストールする」という言葉は、あまり適切ではありません。

というのは、「Node バージョンマネージャ」というソフトがあるワケではないのです。

「ブラウザ」に Chrome や Firefox があって、それぞれ好きなものを使っているように、「Node バージョンマネージャ」には、 nvmnodist など複数のソフトがあって、それぞれのチームが別々に開発しています。

そのうちのどれかを選んでインストールして使う、という形になります。

先述のドキュメント では、Linux/Mac 用と、 Windows 用に2つずつ、紹介されています。

OSX or Linux Node version managers

Windows Node version managers

それぞれ、使い方は微妙に違うと思うので、気に入ったものをインストールするといいです。

私は Macを使っているので nvmをインストールすることにしました。操作が直感的で分かりやすく、気に入っています。

なお、過去にNode インストーラを使ってインストールした 既存の Node.js は、とくにアンインストールせず、追加で nvm をインストールしました。

nvm ls コマンドを使うと、どのバージョンの Node.js を使うのか、選択肢を表示することができるのですが、その選択肢に「system」という項目が現れます。これが、Nodeインストーラからインストールした既存の Node.js をさしていました。

nvm use system コマンドを使うことで、既存の Node.js コマンドに切り替えられるし、 nvm use v10.15.3 コマンドを使うと、nvm が自動的にインストールした v10.15.3 に切り替わります。

紹介されている4つ以外にも、Node バージョンマネージャはいくつか開発されているようです。試してみるのもいいかもしれません。

フロントエンドのお手伝いが増えてくると、「あるプロジェクトで使われているNode.jsのバージョンと、別のプロジェクトで使われている Node.js のバージョンが違う」などということが増えてきます。

sudo コマンドを使うかどうかに関わらず、Node バージョンマネージャを利用していくようにした方がよさそうです。

Node.js 公式サイトと npm の公式サイトとで、npmのインストール先についての見解が違うというのは、なんだか不思議ですが、そのうち話し合いによって、一致されるかもしれませんね。