【Knowledge】iOS開発でのRubyを理解する

iOS開発で利用するcocoaPods、Fastlane、BundlerなどはRubyのGemです。プロジェクトの立ち上げやバージョン更新時しか触る機会がないため忘れないようにまとめておきます。

macOS同梱のRubyについて

macOSにはRubyがプリインストールされています。下記コマンドでバージョン確認が可能です。

ShellScript
ruby -v

iOSアプリ開発ではこちらのRubyは利用しません。理由としてはシステムのRubyバージョンは固定されているため切り替えることができないためです。例えばcocoaPodsなどは最新のRubyバージョンなどを要求するので古いバージョンだと利用できません。OSアップデートなどで勝手にバージョンが変わってしまう場合もあります。

Rubyをインストールする

プリインストールのRubyは先のようなデメリットがあるため、iOSアプリ開発では任意のRubyをインストールしてプロジェクトで利用できるようにします。

Homebrewで直接Rubyをインストールする場合

Bash
brew install ruby

Homebrewから直接Rubyをインストールする方法です。この場合はシステムに1つのRubyを追加することになるため、プロジェクトを分けてrubyバージョンを切り替えることができません。

保存先は/opt/homebrew/opt/rubyなどになるはずです。

rbenvでRubyをインストールする場合

Bash
brew install rbenv

こちらが最も利用されている方法でHomebrewからrbenvというGemをインストールし、rbenv経由でRubyをインストールします。rbenvはRubyを複数バージョン管理できるGemでプロジェクトごとにRubyバージョンを指定することが可能です。

Rubyをインストールする場合は下記コマンドを実行します。

Bash
rbenv install 3.2.5

rbenvの設定について

rbenvを利用してインストールしたRubyは/usr/local/や/opt/homebrew/にインストールされます。気をつける点としてはシステムにもRubyが存在するためrbenvでインストールしたRubyを優先的に拾えるようにパスを通す必要があります。

Rubyの保存先を確認

Bash
rbenv which ruby

// ~/.rbenv/versions/3.x.x/bin/ruby

こちらはRubyの実態が保存されているパスを確認することができます。パスを通すときにこちらを指定してしまうと切り替えができなくなるためshimsを含む別のパスを通します。

shimsとは

rbenvが管理するRuby実体への中継ファイルです。Rubyやgemコマンドを実行するときshimsの内容を読み取ってどのRubyバージョンを使うかを決めます。

shimsは次の順で実行するRubyを決めます

  1. カレントディレクトリの.ruby-version
  2. rbenv localの設定
  3. rbenv globalの設定

shimsのパスの通し方

Bash
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"

まずrbenvを利用することができるようにPATHに追加し、そのあとrbenvのinitを実行することでshimsまでのパスを先頭に追加してくれます。

グローバルとローカルで利用するrubyバージョンを設定する

Bash
rbenv global 3.2.5
rbenv local 3.2.6

globalはシステム全体でlocalはプロジェクト単位です。プロジェクトのルートに.ruby-versionファイルがある場合はそちらが優先されます。

バージョンを確認したい場合は下記コマンドを実行します

Bash
rbenv global
rbenv local  

インストールしているすべてのRubyバージョンを確認したい場合は下記を実行します

Bash
rbenv versions

新しいRubyバージョンをインストールしたとき

shimsの状態を最新にするために下記コマンドを実行します。

Bash
rbenv rehash

Bitrise上での注意点

BitriseのmacOSスタックにはrbenvがプリインストールされており、選択したスタック(Xcodeのバージョン)によってデフォルトのRubyバージョンが異なります。そのためプロジェクトで指定していた.ruby-versionを使おうとしても、デフォルトではインストールされておらずビルドに失敗することがあるため必要に応じてRubyバージョンの更新を検討する必要があります。

asdfでの指定について

Rubyのバージョンを管理するツールはrbenvのみではなく、asdfとオープンソースのバージョン管理ツールがあります。

Bitriseでwhich rubyでrubyの保存先を確認すると下記のパスが出力されました。これはBitriseがRubyバージョンの管理方法をrbenvではなくasdfで行っているためです。

ShellScript
/Users/vagrant/.asdf/shims/ruby

asdfでのRubyバージョンの指定は.tool-versionsで行うのですが、.ruby-versionで記述しても読み取ってくれます。