【Mac OS】npm install -gで権限エラーが出てからzshの環境変数PATH周りとか苦戦したので対処法まとめ
目次
こんにちは。
とあるチュートリアルでnpm install -gを実行したらエラーが出て、結局使えるようになるまでかなり苦戦したので対処法をまとめておきます。
問題の実行コマンド
$ npm install -g hogehoge
-g
オプションはグローバルインストールを意味します。
エラー内容 permission denied
Error: EACCES: permission denied
...
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 install -g
はローカル(つまりプロジェクトフォルダ内)ではなく、グローバルにアクセスできるところにインストールするので問題が起きているようです。
しかし、npmとしては管理者権限実行であるsudo
コマンドを使うことは推奨していないとのこと。(npm sudoでググるとそれっぽい内容が出てきます)
npmのグローバルインストール先を変更する
npm install -g
のインストール先を、ユーザがアクセスできるホームディレクトリ内に変更します。
まずは現在の設定を確認してみます
$ npm config get prefix
/usr/local
なるほど、この場所の中を弄る権利がなかったんですね。
まずはホームディレクトリに設定ファイルを作ります。
$ cd ~
$ vi .npmrc
以下のターミナルコマンドでインストール先を.npm_global
に変更します。
$ npm config set prefix=$HOME/.npm_global
$HOME
はホームディレクトリのパスで、多分/Users/(名前)/
みたいな感じです。$ echo $HOME
で確認できます。
ディレクトリも忘れず作ってあげましょう。
$ mkdir .npm_global
これでインストールできるか...と思ったら、今度はlib
がないと怒られました。
libディレクトリも中に作ってあげます。
$ cd .npm_global
$ mkdir lib
これでようやく無事にnpm install -g
が通りました。
インストールできたがコマンドがNot foundで使えない
さて、無事にインストールできましたが、今度はインストールしたパッケージのコマンドが使えないようです。
zsh: command not found: amplify
これは先程新たに作ったインストールフォルダのパスが環境変数に通っていないので、そのコマンドが見つからないよ!って言われてますね。(そうです。amplifyを使おうとしています。)
環境変数のパスを確認する
まずは今PATHがどこに通っているか調べます
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
:
が場所の区切り文字です。何箇所か通ってますね。(ちなみにこれらのパスは/etc/paths
の中に書かれています。)
環境変数PATHが意味するものは、これらのbin
の中にあるコマンドは特に場所を指定せずとも使える、ということです。
逆に言うと、面倒ですが毎回hogehoge/bin/コマンド
とかディレクトリを指定してコマンドを叩けば動きます。これが面倒なので環境変数で設定しておくんですね。
環境変数のパスを追加する
それではこのPATHに先程グローバルインストールしたbin
ディレクトリを追加していきます。
$ vi .zshrc
.zshrc
内に以下を書き込み保存します。
export PATH=$HOME/.npm_global/bin
以下のコマンドで書き込んだ設定を読み込みます。
$ source .zshrc
反映されているか確認します。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/(foobar)/.npm_global/bin/
追加されてますね。
これで晴れてコマンドが使えるようになりました!
まとめ
というわけで今回はnpm install -g
で権限エラーでインストールできない問題をインストール先を変えることで解決しました。
また、インストールしたパッケージのコマンドを、環境変数にパスを通してわざわざ場所を指定しなくてもグローバルに使えるようにしました。
これでグローバルインストールや環境変数のパスをいじるのも怖くなくなりました!
参考記事
以下の記事を参考にさせていただきました。ありがとうございます!