Macでsudo npmなのにpermission deniedのエラーが出現した


はじめに

気づけば初仕事に入ってもはや2ヶ月。
当初に遭った問題を覚えているうちに書きたいと思います。
Windows民がiMacを配られた初日まずは環境構築でした…
Macの使い方やキーボードの配置すらあやふやの中進んでいて、
とりあえず壁をぶつかりまくりました…
まずsudoって管理者権限なのに権限がないってどういうことだよ!!(怒)

試したこと(失敗)

時間のない人はここを飛ばして解決策を見てください。

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

色々調べてたどり着いたのはこれ。
ざっくりいうとディレクトリの管理者を自分のアカウントに変更してくれます。
これでsudoがなくても普通にインストールできちゃいます。(むしろsudoを使ったらエラーが出ます)
しかし後ほどいろんな問題が浮かび上がりました…
一番大きかったのはiTunesのリソースを割り当てることができませんでしたエラー。
個人の推測ですが権限が変わった影響でディレクトリを見つからない、
もしくは書き込みできなくなったのではないかと。
このエラーのなにがいけないっていうと、
iPhoneから信頼できないため、実機テストができないのです!!
こうなったらインストールできても意味がないじゃん(涙)

これからは自分のアホ体験談です。
つまらない話なので時間のない方飛ばしてくださいね(二回目)
「sudo chownはだめだったので、元に戻したい!」と思ってとった行動は…
sudo chown -R root $(npm config get prefix)/{lib/node_modules,bin,share}
(実際のコマンドを忘れたがこんな感じ)
「再び権限をrootユーザーに戻せば大丈夫なはず!」という安易な思考から、
自らすべての権限を奪い、キーボードやブラウザの使用権限さえなくなりました。
初期化せざるを得ない状況を作り出したのだ…あれもはやホラーです…
これは、絶対、やっちゃいけません。

解決策

https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally
に書いてありました。

  1. ホームディレクトリに新しいディレクトリを作成(元のディレクトリの代わりに使います)
    mkdir ~/.npm-global

  2. 新しいディレクトリを設定
    npm config set prefix '~/.npm-global'

  3. 文字エディターを開いて、ファイルを新規作成し、以下の行を追加
    export PATH=~/.npm-global/bin:$PATH

  4. 保存する。名前は.profileで保存先はホームディレクトリ
    (隠しファイルなので保存してもFinderでは見えません)

  5. 再びcmdに戻って、sourceコマンドで作成したファイルを反映させる
    source ~/.profile

これでnpm install -gをそのまま使えるようになりました!

解決策追記(2019/12/05)

上記の文字エディターの部分はviを使うことも可能です。
そうすると全てがターミナルに完結できて、その方が使いやすいと思う方もいらっしゃるではないかと。
具体的に言うと、上記の3.4.の代わりに以下の手順を使います。

  1. viを使い新規ファイル~/.profileを作成する
    vi ~/.profile

  2. iキーを押し、編集モードにして、1行目に追加
    export PATH=~/.npm-global/bin:$PATH

  3. Escキーで編集モードを終了させ、:wqで保存して戻る

そうするとわざわざ文字エディターを開かなくても大丈夫です!
と言いながら、半年前の自分は
「コマンドですって!?!?(((((( ;゚Д゚)))))ガクガク」
の状態だったので、文字エディターを使った方が気が楽だったで、
そう記述しました。
今になったらこそ、全部ターミナルで完結した方が楽じゃない?と言えるけど、
これでも成長ですかね?(笑)

おまけ

これで解決できましたが、cmdを開くたびにsource ~/.profileを打たないと反映されませんでした。
毎回だとめんどくさいので、それについても調べました。
どうやら~/.bash_profileというログイン時実行される設定ファイルが存在しています。
なので、それを編集して無事~/.profileの内容が自動的に反映されるようになりました!

  1. cmdで~/.bash_profileを呼び出す
    vi ~/.bash_profile

  2. iキーを押すとで編集モードになり、最後の行に追加
    source ~/.profile

  3. Escキーで編集モードを終了させ、:wqで保存して戻る

さいごに

コマンドプロンプトを使い慣れた方には簡単なことかもしれませんが、
自分は結構苦戦したので、
こんな風にまとめて、一人でも苦戦している方の悩みを解決できたら幸いです。