背景
アプリに地図を入れたい!と思い立ち、こちらのチュートリアルを進めていたところ、パッケージマネージャーにCocoaPodを使うようだったのでインストールすることにしました。
しかし、Macに標準で入っているRubyのバージョンが古かったためインストール自体出来ないという踏んだり蹴ったりな状況となりました。
かなり詰まったため、備忘録として残します。
作業録
ではここから私の作業録を書いておきます。
そもそもの目的
やりたかったことは単純明快でCocoaPodをインストールすること、それにつきます。
試したこと
CocoaPodの公式サイトに則ったインストール
公式サイトに行くと
$ sudo gem install cocoapods
でインストールすることとありますが、これではエラーが出ます。
You don’t have write permissions for the /usr/bin directory.
つまり、/usr/binに対する書き込み権限が無いため怒られています。
ではインストール先を変える必要がありますが、様々な記事を参考にしたところ、/usr/local/binが適しているようでした。
インストール先を変えてリトライ
インストール先を変更して以下のコマンドを入力します。
$ sudo gem install cocoapods -n /usr/local/bin
その結果次の怒られが発生しました。
Operation not permitted - /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/gem
どうやらgemに利用しているRubyのバージョンが古いようで、3系へのアップデートを裏でかけていたようですが、それが失敗したみたいです。
バージョンを見てみると
$ ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin24]
確かに2系になっています。
ではRubyのアップデートを手動でしようとなるわけです。
Rubyのアップデート
とりあえず3系にすれば良いそうなのですが、一旦テストも兼ねて2.7.8にアップデートしてみました。その結果が以下です。
$ sudo gem update --system 2.7.8 -n /usr/local/bin
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/gem
そもそもアップデートが権限不足で出来ない…?
chatGPTに聞いてみたところ次の回答が得られました。
「このエラーは、システムディレクトリへの書き込み権限が不足しているために発生しています。macOSのシステムにプリインストールされているRubyのディレクトリは通常保護されており、直接更新することは推奨されていません。」
なんだって!?ということはそもそもこのコマンドは直接アップデートをしようとしているから何系であろうと動かないじゃないか!!!
そのとおりです。とはいえ、権限を変えるのはあまりしたくありません。そこで調べたところ、どうやらrbenvなるRubyのバージョンマネージャーが存在しているようで、そちらなら更新が可能なようです。
rbenvを利用したRubyのアップデート
こちらのgithubのREADMEが公式ドキュメントです。
早速brewでインスコ、Rubyのバージョンアップを図ります。
まずrbenvのセットアップです。
$ brew install rbenv (brewでのインストール)
$ rbenv --version (インストールの確認)
rbenv 1.2.0
$ rbenv init
# Load rbenv automatically by appending
# the following to ~/.zshrc:
eval "$(rbenv init - zsh)"
$ vi ~/.zshrc
末尾の行にeval "$(rbenv init - zsh)"を追記
これでセッティングは終了です。Readmeにも書いているので適宜参照してください。
次はいよいよアップデートです。
$ rbenv install --list
3.1.6
3.2.4
3.3.3
jruby-9.4.7.0
mruby-3.3.0
picoruby-3.0.0
truffleruby-24.0.1
truffleruby+graalvm-24.0.1
$ rbenv install 3.2.4
$ rbenv versions
* system (set by /Users/[username]/.rbenv/version)
3.2.4
$ rbenv global 3.2.4
$ rbenv versions
system
* 3.2.4 (set by /Users/haizi/.rbenv/version)
これで一旦はシステムが見るバージョンが3.2.4に変わりました。
確認してみると
$ ruby -v
ruby 3.2.4 (2024-04-23 revision af471c0e01) [arm64-darwin24.0.0]
となっており、反映されていることがわかります。
もし反映されていない場合は、terminalの再起動を行ってみてください。反映されると思います。
ようやくrubyのバージョンを上げることが出来ました。やっとCocoaPadのインストールが出来るでしょう。
CocoaPodのインストール
それでは先程と同じコマンドを入れてみます。
$ sudo gem install cocoapods -n /usr/local/bin
Password:
Fetching atomos-0.1.3.gem
Fetching colored2-3.1.2.gem
Fetching nanaimo-0.3.0.gem
.
.
.
34 gems installed
$ pod setup
Setup completed
やっとインストール出来ました!
まとめ
Rubyが保護領域にあるため、コマンドでアップデート出来ない点にはハマりました…
nodeでいうnodeenvやvoltaのようなものを使ってrubyもアップデートしなきゃならないんですね。調べた技術記事でrbenvを使わないコマンドでアップデート出来ているのも多々見かけたのですが、何が違うのでしょうか…?
同じようなエラーで詰まっている方がいらっしゃれば、ぜひ参考にしてみてください。
参考文献