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
1 2 3 4 |
$ xcode-select --install $ source ~/.bash_profile |
homebrewのインストール
Mac用パッケージマネージャーのhomebrewを入れます。これを使ってrbenvを入れます。
1 2 3 |
$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" $ source ~/.bash_profile $ brew update |
openssl、readline、libiconv
openssl、readline、libiconvを入れます。Rubyの正常な動作に必要です。opensslなどはMacに標準であるようですが、古い・不具合がある等でhomebrewで入れなおすのが良いようです。
homebrewで入れた方を採用するために、brew link
コマンドで既存のものからリンクを張り変えます。強制的に実行するため、–forceオプションを付けて下さい。
標準から変更したくない場合、ruby のインストールの都度、オプションとして指定することも可能です(後述)。そうする場合は、brew link ...
は実行しないでください。
1 2 3 4 5 6 7 8 9 10 |
$ brew install openssl $ brew link openssl --force $ brew install readline $ brew link readline --force $ brew install libiconv $ brew link libiconv --force $ source ~/.bash_profile |
rbenvのインストール
いよいよrbenvを入れます。
1 2 3 |
$ brew install rbenv ruby-build $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile $ source ~/.bash_profile |
rbenvにプラグインを入れる
rbenv rehash
rbenvは構成が変わるたびにrbenv rehash
が必要です。これを自動化するプラグインを入れます。
1 |
git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash |
rbenv binstubs
ディレクトリローカルにインストールしたパスが通っていない gem にパスを通してくれるようになるプラグインです。bundle exec ...
が不要になります。
1 |
git clone git://github.com/ianheggie/rbenv-binstubs.git ~/.rbenv/plugins/rbenv-binstubs |
ruby のインストール
rbenv install -l
を実行することで、インストール可能なものの一覧を確認することが出来ます。
1 2 3 4 5 6 7 8 |
$ rbenv install -l Available versions: (...略...) 2.1.0-rc1 2.1.1 2.1.2 2.2.0-dev (...略...) |
インストールは、rbenv install
に、一覧で確認したインストールしたいバージョン番号を渡します。
この時、rbenvのインストールの手順で、brew link ...
を実行した場合は以下のみを実行します。
1 |
$ rbenv install 2.1.2 |
brew link ...
を実行しなかった場合は以下を実行します。RUBY_CONFIGURE_OPTSによって、Rubyに使用させるopenssl、readline、libiconvにbrewでインストールしたものを指定しています。
1 |
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl) --with-iconv-dir=$(brew --prefix libiconv)" rbenv install 2.1.2 |
bundler のインストール
bundlerはgemを管理する機能を持ったものです。bundler自体もgemです。bundlerとbundlerが依存するgemについては、Rubyに紐づく形でグローバルにインストールします。
rbenvによって管理されたRubyと、それに紐づくBundlerの環境の上に、各プロジェクトのディレクトリが互いに独立する形で、それぞれのプロジェクトが必要なGemを持っているような状態を目指します。
gem install bundler
を実行すれば、使用中のRubyにbundlerが入ります。rbenv global
コマンドでインストールしたRubyを有効化してgem install bundler
します。
1 2 3 4 5 |
$ rbenv global 2.1.2 $ rbenv versions system * 2.1.2 (set by /Users/niwatako/.rbenv/version) $ gem install bundler |
Rubyのバージョンは、このあとディレクトリごとに指定するので、bundlerのインストールが終わったら、グローバル環境のRubyはOS標準のものに戻しておきましょう。
1 2 3 4 |
$ rbenv global system $ rbenv versions * system (set by /Users/niwatako/.rbenv/version) 2.1.2 |
ディレクトリローカルにRubyバージョンを指定する
ここまでで汎用的な環境が構築出来ました。あとはプロジェクトの立ち上げ毎に行うことになります。
あるいは、rubyの新しいバージョンを採用するときは、少し手順を戻ってRubyのインストールとbundlerのインストールを行って下さい。
ディレクトリ内でのRubyのバージョンを指定
rbenv local
コマンドで、カレントディレクトリで有効にするRubyのバージョンを指定することが出来ます。
1 2 3 |
$ rbenv local 2.1.2 $ cat .ruby-version 2.1.2 |
カレントディレクトリに .ruby-version ファイルが作成され、指定したRubyのバージョンが記録されました。これによって、グローバル環境のRubyのバージョンにかかわらずこのディレクトリ内では指定したバージョンが利用されます。
.ruby-version ファイルは、プロジェクトのファイルの一部としてGitなどにコミットしておくことで、他の人がCloneした際にも、rbenvさえインストールされていれば .ruby-version ファイルに指定されたRubyのバージョンが適用されるようになります。
これによってプロジェクトで利用するRubyのバージョンを統一し、コードで管理することが出来るようになりました。
ディレクトリローカルにgemをインストールする
bundlerを使って、ディレクトリ内にのみ有効な形でgemをインストールします。
bundlerを使う準備
bundle init
コマンドによってGemfileを生成します
1 2 3 4 5 6 |
$ bundle init $ cat Gemfile # A sample Gemfile source "https://rubygems.org" # gem "rails" |
このGemファイルは、CocoaPodsで言うところのPodfileです。
CocoaPodsを入れてみる
GemfileにCocoaPodsを書き込み、bundle install
にローカルインストール用のオプションを付けて実行します。
1 2 3 4 |
$ echo 'gem "cocoapods"' >> Gemfile $ bundle install\ --path=vendor/bundle\ --binstubs=vendor/bin |
--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が使えるようになっているはずです。
1 2 3 4 |
pod setup $ pod init $ echo "pod 'AFNetworking', '~> 2.5’" >> Podfile $ pod install |