CocoaPoderと賢者の宝石 〜 まだ bundle exec で消耗してるの? 〜

  • このエントリーをはてなブックマークに追加

CocoaPodsを使うiOSエンジニアのためのRubyを上手く活用したCocoaPods環境を作る方法。

・みんな違うバージョンのCocoaPodsを使っていて
・Podfile.lock の行末バージョン表記が異なって困る
・CocoaPodsバージョンアップしたせいで動かない
・bundle exec が面倒
・bundle exec の alias を作った

・・・このような問題はRuby界隈に用意された便利なツール群を使いこなすことで解決できます。

問題点と解決方針

第61回 Cocoa勉強会関西 – iOS/Macアプリ開発勉強会yidev 第19回勉強会で発表した資料があるので、概要はこちらをご覧ください。

実際のやり方

実際にコマンドレベルで手順を解説していきたいと思います。

rbenv のインストール

homebrew を使ってインストールする方法です。
まずrbenvに必要なツール群をインストールしていきます。
MacPortsを使用している場合、相性が悪いので不要であればMacPortsをアンインストールして下さい。

MacPortsと併用する場合は自己責任でお願いします。私は必要があり併用しています。

Xcode Command Line Tooles

homebrewのインストール

Mac用パッケージマネージャーのhomebrewを入れます。これを使ってrbenvを入れます。

openssl、readline、libiconv

openssl、readline、libiconvを入れます。Rubyの正常な動作に必要です。opensslなどはMacに標準であるようですが、古い・不具合がある等でhomebrewで入れなおすのが良いようです。

homebrewで入れた方を採用するために、brew linkコマンドで既存のものからリンクを張り変えます。強制的に実行するため、–forceオプションを付けて下さい。

標準から変更したくない場合、ruby のインストールの都度、オプションとして指定することも可能です(後述)。そうする場合は、brew link ...は実行しないでください。

rbenvのインストール

いよいよrbenvを入れます。

rbenvにプラグインを入れる

rbenv rehash

rbenvは構成が変わるたびにrbenv rehashが必要です。これを自動化するプラグインを入れます。

rbenv binstubs

ディレクトリローカルにインストールしたパスが通っていない gem にパスを通してくれるようになるプラグインです。bundle exec ...が不要になります。

ruby のインストール

rbenv install -lを実行することで、インストール可能なものの一覧を確認することが出来ます。

インストールは、rbenv install に、一覧で確認したインストールしたいバージョン番号を渡します。
この時、rbenvのインストールの手順で、brew link ...を実行した場合は以下のみを実行します。

brew link ...を実行しなかった場合は以下を実行します。RUBY_CONFIGURE_OPTSによって、Rubyに使用させるopenssl、readline、libiconvにbrewでインストールしたものを指定しています。

bundler のインストール

bundlerはgemを管理する機能を持ったものです。bundler自体もgemです。bundlerとbundlerが依存するgemについては、Rubyに紐づく形でグローバルにインストールします。

rbenvによって管理されたRubyと、それに紐づくBundlerの環境の上に、各プロジェクトのディレクトリが互いに独立する形で、それぞれのプロジェクトが必要なGemを持っているような状態を目指します。

rbenv で作るRuby・bundler・gem環境の構成図

gem install bundlerを実行すれば、使用中のRubyにbundlerが入ります。rbenv globalコマンドでインストールしたRubyを有効化してgem install bundlerします。

Rubyのバージョンは、このあとディレクトリごとに指定するので、bundlerのインストールが終わったら、グローバル環境のRubyはOS標準のものに戻しておきましょう。

ディレクトリローカルにRubyバージョンを指定する

ここまでで汎用的な環境が構築出来ました。あとはプロジェクトの立ち上げ毎に行うことになります。
あるいは、rubyの新しいバージョンを採用するときは、少し手順を戻ってRubyのインストールとbundlerのインストールを行って下さい。

ディレクトリ内でのRubyのバージョンを指定

rbenv localコマンドで、カレントディレクトリで有効にするRubyのバージョンを指定することが出来ます。

カレントディレクトリに .ruby-version ファイルが作成され、指定したRubyのバージョンが記録されました。これによって、グローバル環境のRubyのバージョンにかかわらずこのディレクトリ内では指定したバージョンが利用されます。

.ruby-version ファイルは、プロジェクトのファイルの一部としてGitなどにコミットしておくことで、他の人がCloneした際にも、rbenvさえインストールされていれば .ruby-version ファイルに指定されたRubyのバージョンが適用されるようになります。

これによってプロジェクトで利用するRubyのバージョンを統一し、コードで管理することが出来るようになりました。

ディレクトリローカルにgemをインストールする

bundlerを使って、ディレクトリ内にのみ有効な形でgemをインストールします。

bundlerを使う準備

bundle initコマンドによってGemfileを生成します

このGemファイルは、CocoaPodsで言うところのPodfileです。

CocoaPodsを入れてみる

GemfileにCocoaPodsを書き込み、bundle installにローカルインストール用のオプションを付けて実行します。

--path=vendor/bundleによって、インストールされるgemがディレクトリ内のvendor/bundle に入り、グローバル環境を汚しません。
--binstubs=vendor/binによって、gemの実行ファイルがディレクトリ内のvendor/binに入り、rbenv binstubs プラグインによってパスが通されるようになるので、bundle exec ...を打つ必要がなく、直接gemのコマンドを呼び出すことが出来るようになります。(bundle exec pod ではなく、 pod でよくなる)

これらのオプションが指定した内容は、ディレクトリ内の.bundleフォルダ内に記録されるので、2度めはオプションが不要になる上に、.bundleフォルダをGitなどにコミットするとメンバー間で共有できます。

CocoaPodsを使ってみる

CocoaPodsが使えるようになっているはずです。

お役に立ちましたか?

  • このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です