現在、Angular と npm を学習中です。今日はnpm i -g @angular/cli
Fedora で実行しようとしましたが、インストールされずにターミナルに次のメッセージが表示されました (便宜上、メッセージを短縮しています)。
npm WARN checkPermissions Missing write access to /usr/lib/node_modules
そこでGoogleで調べてみたところ、このnpmの説明この記事を読んで、別のnpmの記事このエラーをより詳細に説明しています。後者の記事では、次のように述べています。
パッケージをグローバルにインストールしようとしたときに EACCES エラーが表示される場合は、次のいずれかを実行できます。
ノードバージョンマネージャーを使用してnpmを再インストールします(推奨)。
または
npmのデフォルトディレクトリを手動で変更する
簡単な解決策としては、上記の両方の解決策が問題ないように見えました。
しかし、Linux の経験が少しあるので、疑問に思い始めました。なぜ別のソフトウェアをインストールしたり、設定を変更したりする必要があるのでしょうか。言い換えると、npm のデフォルト設定と Fedora のデフォルト設定では、エラーが発生しないように、なぜどちらか 1 つでも調整する必要があるのでしょうか。
これらの質問を自分自身に問いかけた後、問題は npm の設定にあるのではないかと考えました。おそらくインストール以降何も変更していないのでしょうが、誰にもわかりません。そこで、npm を再インストールすることにしました。念のため、アンインストール後にコンピューターを再起動しました。再インストール後、npm i -g @angular/cli
もう一度試してみましたが、同じエラーが発生しました。
そこで私はこう思いました。npm の問題ではなく、私の Fedora インストールの問題なのかもしれません。そのような理由で Fedora を再インストールしたくはありませんでした。そこで、Fedora のディレクトリのデフォルト権限が/usr/lib/node_modules
デフォルトのままであるかどうかを Google で確認しました。私のディレクトリでは、、/usr
と/usr/lib
(/usr/lib/node_modules
そして についても/usr/lib/node_modules/npm
) 所有者とグループは でroot root
、所有者のみが書き込み権限を持っています。私が見つけた唯一の情報源は「Fedora 26 インストールガイド」(私は Fedora 29 をインストールしていますが) で、そのドキュメントでは、ファイルシステム階層標準 2.3ディレクトリ構造については、node_modules
npm が要求する権限を正確に割り当てていると思っていたので、 と のみをチェックしました/usr
。ディレクトリ/usr/lib
については/usr
、FHS は権限について何も述べていないようでしたが、/usr/lib
ディレクトリについては、次のように述べていました。
/usr/libには、ユーザーやシェルスクリプトによって直接実行されることを意図していないオブジェクトファイル、ライブラリ、内部バイナリが含まれています。[22]
この情報もあまり役に立ちませんでした。
結局、私は、自分が受け取ったエラーの本当の原因がまだ何なのか理解していないという結論に達しました。そこで、次の質問をしたいと思います。
- npm は、新しいパッケージを配置するようにデフォルトで構成する必要があるのでしょうか
/usr/lib/node_modules
? - もしそうなら、Fedora はそれらのディレクトリに対して持つべき/持つべき/持つかもしれない他のデフォルトの権限を設定しているのでしょうか?
- いいえの場合、Fedora インストールのそれらのディレクトリの権限を誤って変更した可能性がありますか?
- いいえの場合、ルート権限で npm パッケージをインストールしていないことが原因でしょうか? これも修正方法のようですが、npm のドキュメントにはそのような解決策は記載されていません。
- いいえの場合、npm パッケージをグローバルにインストールしようとしているのでしょうか? もしそうなら、なぜそのような可能性があるのでしょうか?
- 何か理解していないことや、見落としていることがあるのでしょうか? 最新のドキュメントが不足しているのかもしれません。
アップデート:すべてのコマンドを root ではなく通常のユーザーとして実行していることを指摘するのを忘れました。
答え1
どのユーザーとして実行したかは書かれていませんが、root ではなかったと推測します。その場合、エラーは正しいですが、通常のユーザーはシステム ディレクトリにインストールできないはずなので、予想通りです。
いずれにしてnpm
も、Fedora でパッケージ化された Node.js を使用してパッケージをグローバルにインストールするためには、 を使用しないでください。 rpm で管理されたモジュールと npm で管理されたモジュールが混在した混乱状態になってしまうからです/usr/lib/node_modules
。
残念ながら、他の言語環境とは異なり、Node.js は 2 つの別々のグローバル モジュール ディレクトリ (/usr
システム パッケージによって管理されるモジュール用と、/usr/local
言語環境独自のツールによって管理されるモジュール用) をサポートしていないため、npm に大規模なパッチを適用せずにこれを適切に動作させることはできませんが、これは望ましくありません。このような分割が可能であったとしても、perl、python、ruby の場合と同様に、グローバル インストールを実行するには root である必要があります。
私の理解では、Node.js ではグローバル インストールは推奨されていません。アップストリームの見解では、プロジェクトに必要なモジュールだけを各プロジェクトにローカルにインストールする必要があるということです。