こちらの記事はIMPL Advent Calendar 2022の25日目のエントリです。
メリークリスマス!
本記事ではReact Native CLIからプロジェクトをビルドしようとした際に発生した、gemのpermmisionエラーについて書いていきます。
また今回の内容は主にこちらの記事で学習したことをアウトプットすることを目的としております。
大変分かりやすいので、是非ご参照ください。
エラー発生
React Native CLIよりプロジェクトを作成しようとした際、以下のエラーが返されました。
<span class="red">✖</span> Installing Bundler
<span class="red">error</span> /Library/Ruby/Site/2.6.0/rubygems.rb:265:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
from /Library/Ruby/Site/2.6.0/rubygems.rb:284:in `activate_bin_path'
from /usr/bin/bundle:23:in `<main>'
※プロジェクトのビルドについては以下のセットアップガイドに従っています。
おかしい、先月まで同じディレクトリ内で何事もなくビルド出来ていたのに……。
何かしらのバージョンを上げたせいか、はたまたOSアップデートのせいかは分かりませんでしたが、
調べるとどうもgemのpermissionエラーが関係しているようです。
permissionエラーとは
permission(許可)のエラー、つまるところ「権限がありません」という場合に表示されるエラーのことだそうです。
今回のケースだと、システム側のRubyからgemファイルに書き込み処理を実行しようとした際、gemファイルへの書き込み権限が無い=許可されていないために発生している模様。
ここで言うシステム側のRubyとは、以下のディレクトリにあるRubyのことです。
/usr/bin/ruby
上記のような、rubyのパスを調べるコマンドはこちら。
$ which ruby
“ruby”部分を”gem”とすることで、同じようにgemファイルのパスも確認できます。
解決策
rbenvが管理するRubyを確認、変更する
ではどうすればいいかというと、”システムのRuby”ではないRubyから処理を行う必要があります。
おそらく開発を行っている方の多くはで、Rubyをバージョンマネージャーで管理していることかと思います(React Nativeのセットアップガイドでも推奨しています)。
私はrbenvによってバージョン管理しているので、rbenvを例に、まずはバージョン情報を確認します。
$ rbenv versions
>> * system (set by /Users/ユーザー名/Desktop/Training/.ruby-version)
2.7.4
2.7.5
バージョン確認のコマンドを打ち込むと、上記の結果が返ってきました。先頭にアスタリスクの付いているものが、現在のRubyのバージョンを指します。
……思いっきりシステムって書いてある笑
ちなみにこのRubyのバージョン自体は2.6.8でした。が、大事なのは権限の有無。
この確認の時点で、お使いの環境が違うバージョンを指している場合は以下を省略できます。
次のステップ「rbenvのRubyを呼び出す」へお進みください。
私はsystemとなっていましたので、早速、Rubyのバージョン変更を行います。
※systemしかないよという方は、別途、rbenvにインストールする必要があります。
とりあえず、現状の最新安定動作版である3.1.3を採用。
$ rbenv local 3.1.3
コマンド実行後、versionsで確認すると、アスタリスクが3.1.3に移動しているのが見て取れるかと思います。
これでOK……かと思いきや、もう一手間必要です。
rbenvのRubyを呼び出す
先ほど行ったのはrbenvが管理しているRubyをシステムと異なるバージョンに変更しただけです。
つまりこの時点ではプロジェクトをビルドした際に処理を行うRubyはシステムのRubyとなります。
その証拠に、rbenvのバージョン変更をした後whichコマンドで確認しても
$ which ruby
>> /usr/bin/ruby
変化ありません!
まぁ、よく考えたら当たり前というか……先ほどまでは「rbenvのRubyも、whichで調べたものと同じシステムのRubyを指していた」だけです。
ですので、whichコマンドを打った際に、rbenvの管理下のRubyが呼び出されているようなパス構成にする必要があります。
元サイト様におんぶに抱っこですが、以下を打ち込むことでrbenvにパスを通します。
[[ -d ~/.rbenv ]] && \
export PATH=${HOME}/.rbenv/bin:${PATH} && \
eval "$(rbenv init -)"
このコマンド(ファイルを書き換えるためのものなので、正しくはテキスト)が意味することは、後々追記したいと思います。
いずれにせよ、これによりパスが通ります。whichコマンドで確認しましょう。
$ which ruby
>> /Users/ユーザー名/.rbenv/shims/ruby
無事にrbenv配下のRubyにパスが通っていることが確認できました!
補足
なお、今回取り上げたwhichコマンドは「現在いるディレクトリから通るgemの場所」を表しています。
そのため、別なディレクトリから参照すると元のシステム側のRubyを参照しているのでご留意ください。この辺りも、いちいち設定し直さないで済む方法を確立しておきたいところです。