CocoaPodの落とし穴様々

# 背景
アプリに地図を入れたい！と思い立ち、[こちらのチュートリアル](https://developers.google.com/codelabs/maps-platform/maps-platform-101-swift?hl=ja#2)を進めていたところ、パッケージマネージャーにCocoaPodを使うようだったのでインストールすることにしました。
しかし、Macに標準で入っているRubyのバージョンが古かったためインストール自体出来ないという踏んだり蹴ったりな状況となりました。
かなり詰まったため、備忘録として残します。

# 作業録
ではここから私の作業録を書いておきます。

## そもそもの目的
やりたかったことは単純明快で**CocoaPodをインストールする**こと、それにつきます。

## 試したこと
### CocoaPodの公式サイトに則ったインストール
公式サイトに行くと
```terminal
$ sudo gem install cocoapods
```
でインストールすることとありますが、これではエラーが出ます。
```
You don’t have write permissions for the /usr/bin directory.
```
つまり、/usr/binに対する書き込み権限が無いため怒られています。
ではインストール先を変える必要がありますが、様々な記事を参考にしたところ、/usr/local/binが適しているようでした。

### インストール先を変えてリトライ
インストール先を変更して以下のコマンドを入力します。
```terminal
$ 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系へのアップデートを裏でかけていたようですが、それが失敗したみたいです。
バージョンを見てみると
```terminal
$ ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin24]
```
確かに2系になっています。
ではRubyのアップデートを手動でしようとなるわけです。

### Rubyのアップデート
とりあえず3系にすれば良いそうなのですが、一旦テストも兼ねて2.7.8にアップデートしてみました。その結果が以下です。
```terminal
$ 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](https://github.com/rbenv/rbenv)のREADMEが公式ドキュメントです。
早速brewでインスコ、Rubyのバージョンアップを図ります。
まずrbenvのセットアップです。
```terminal
$ 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にも書いているので適宜参照してください。

次はいよいよアップデートです。
```terminal
$ 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に変わりました。
確認してみると

```terminal
$ ruby -v
ruby 3.2.4 (2024-04-23 revision af471c0e01) [arm64-darwin24.0.0]
```

となっており、反映されていることがわかります。
もし反映されていない場合は、terminalの再起動を行ってみてください。反映されると思います。

ようやくrubyのバージョンを上げることが出来ました。やっとCocoaPadのインストールが出来るでしょう。

### CocoaPodのインストール
それでは先程と同じコマンドを入れてみます。
```terminal
$ 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を使わないコマンドでアップデート出来ているのも多々見かけたのですが、何が違うのでしょうか…？
同じようなエラーで詰まっている方がいらっしゃれば、ぜひ参考にしてみてください。

# 参考文献
https://cocoapods.org/

https://github.com/rbenv/rbenv

https://qiita.com/hujuu/items/3d600f2b2384c145ad12

https://qiita.com/kohki33/items/f4b0b4c92d031542c2ab

https://zenn.dev/chocolatemutton/articles/0d68353cf663b9

https://zenn.dev/tmasuyama1114/articles/rbenv-switch-ruby-versions

https://cpoint-lab.co.jp/article/202103/19443/