CocoaPods の Swift ライブラリを使えるようにする。
CocoaPods
CocoaPods がSwift に対応したと聞き、さっそく自分のプロジェクトでも使えるようにしてみました。
その途中でいくつかエラーに見舞われたので、その対処法も調べてみました。
CocoaPods がSwift に対応したと聞き、自分のプロジェクトでも使えるようにしてみました。
久しぶりにCocoaPods を使ったせいか、いろんなところでエラーが発生したので、その解消法が中心となります。OS は OS X Yosemite 10.10.1 です。
以前にCocoaPods を使ってみたときのお話はEZ-NET: CocoaPods を使ってオープンソースのライブラリをプロジェクトで簡単に管理する : Objective-C プログラミング に記しています。
Cocoapods 0.36 での Swift への対応方法
先日に CocoaPods 0.35 で Swift ライブラリに対応させる方法を試してみましたが、改めて別の Mac で CocoaPods で使ってみようとしたら、今は CocoaPods 0.36 になっていました。
Swift 対応 CocoaPods のインストール
CocoaPods 0.36 では、次のようにして Beta 版をインストールすることで、Swift ライブラリを CocoaPods で扱えるようになるようです。
sudo gem install cocoapods --pre
これで、あとは普段通りにpod install
やpod update
を行うことで、CocoaPods の Swift ライブラリを利用できます。
Swift ライブラリのインストール
たとえば、次のようなPodfile
を用意したとします。
source 'https://github.com/CocoaPods/Specs.git'
platform :osx, '10.10'
pod 'SwiftyJSON', :git => "https://github.com/orta/SwiftyJSON", :branch => "podspec"
これでbundle exec pod install
やbundle exec pod update
を行うと、該当するライブラリがフレームワークとして組み込まれ、すぐに利用できるようになります。
今回のSwiftyJSON の場合、名前空間が「SwiftyJSON」で定義されているので、これを使いたいコード内で、次のようにしてモジュールをインポートできます。
import SwiftyJSON
これで、このモジュールに含まれるオブジェクトをJSON
やSwiftyJSON.JSON
のようにして利用できます。
Cocoapods 0.35 の頃の Swift への対応方法
先日に CocaPods 0.35 を Swift に対応させたときには、次の準備が必要になるようでした。
- プロジェクトに
Gemfile
を用意する。 bundle install
を実行する。
そうして準備ができたら、あとは bundle exec pod install
や bundle exec pod update
などを使って Swift 対応パッケージを更新できます。
用意する Gemfile
プロジェクトに用意するGemfile
は次の通りです。
source 'https://rubygems.org'
gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git', :branch => 'swift'
gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git'
gem 'xcodeproj', :git => 'https://github.com/CocoaPods/Xcodeproj.git'
gem 'claide', :git => 'https://github.com/CocoaPods/CLAide.git'
プロジェクトの更新方法
Gemfile
を用意したら、次のコマンドを実行します。
bundle install
このコマンドが正常終了すれば Swift 対応のCocoaPods を利用できるようになります。
このように、Swift ライブラリを使いたいプロジェクトで事前に、Gemfile
を作ってbundle install
を実行しておくことで、利用準備は完了です。
あとは bundle exec pod install
や bundle exec pod update
などを使って CocoaPods の Swift ライブラリを利用できます。
bundle
コマンドが存在しない場合は、sudo gem install bundler
とすることでインストールできます。
CocoaPods 0.36 でも Gemfile の ", :branch => 'swift'" を削除することで、この bundle コマンドを使う方法でもインストールできる様子でした。バージョン情報を付けて『gem 'cocoapods', '>=0.36.beta', :git => 'https://github.com/CocoaPods/CocoaPods.git'』としても良いかもしれません。
自分の環境でCocoaPods をSwift 対応させてみたところ…
自分の環境でも CocoaPods を Swift に対応させようと、上記の手順でbundle install
を実行したところで次のエラーが発生しました。
An error occurred while installing i18n (0.6.11), and Bundler cannot continue.
Make sure that `gem install i18n -v '0.6.11'` succeeds before bundling.
bundle install で失敗する
エラーメッセージの上に表示されていた警告には、次のメッセージが表示されていました。
Gem::RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://rubygems.org/gems/i18n-0.6.11.gem)
どうやらHTTPS
の証明書のチェックでエラーが発生している様子です。
サーバー証明書を更新する
ターミナルからrvm osx-ssl-certs status all
を実行してみたところ、次のような結果が得られました。
Certificates for /etc/openssl/cert.pem: Old.
どうやら証明書情報が古い様子なので、次のコマンドを実行して、証明書情報を更新してみました。
rvm osx-ssl-certs update all
これで証明書情報が更新されて、先ほどのrvm osx-ssl-certs status all
コマンドの出力結果もCertificates for /etc/openssl/cert.pem: Up to date.
になりました。
これで無事にbundle install
コマンドも成功するようになりました。
pod install で失敗する
rvm osx-ssl-certs status all
コマンドが成功したので、さっそく使ってみようと思って pod install
を実行してみたところ、次のエラーが発生しました。
[!] Invalid `Podfile` file: undefined method `source' for #<Pod::Podfile:0x007f9d9183fc08>. Updating CocoaPods might fix the issue.
そしてこのエラーは、用意しておいたPodfile
の次の行で発生している様子でした。
source 'https://github.com/CocoaPods/Specs.git'
とりあえずpod update
を実行してみたところ、処理が正常に終わった後で、次のメッセージがターミナルに表示されました。
CocoaPods 0.35.0 is available. To update use: sudo gem install cocoapods\n Setup completed (read-only access)
原因は使用する CocoaPods の間違いの様子
これについては@k_katsumiさん
から『bundle exec
を使わないと、bundle install
でインストールした CocoaPods が使われない』というアドバイスを頂きました。
@es_kumagai http://t.co/F1AuPICvKG このSwiftでCocoaPodsを使う記事、少し勘違いをされていて、BundlerでインストールしたGemのコマンドはbundle execを頭につけないと、グローバルにインストールされたGemが使われます。
— kishikawa katsumi (@k_katsumi) 2014, 12月 31
@es_kumagai つまり、bundle installでGemをインストールしたのに、pod installと打ったためにもともと入っていた古いgemが参照されて失敗したということです。で、もともと入っていたほうを更新して結果オーライですが
— kishikawa katsumi (@k_katsumi) 2014, 12月 31
なるほど、ぜんぜん知らずに使ってました。
何も知らぬまま、画面に指示された通りに sudo gem install cocoapods
を実行して、その時は CocoaPods が利用できるようになったのですけど、bundle install
の後は bundle exec pod install
というようにすれば良かったんですね。
併せて bundle コマンドが Bundler という Ruby のツールだということ、そもそも gem というのが Rubygems という Ruby 言語用のパッケージ管理システムということも知れて、そもそもなところから勉強になりました。ありがとうございます!
MacBook Pro でのインストールで失敗する
上記で bundle コマンドについて少しわかったところで、改めて試してみようと、まだ CocoaPods に手をつけていなかった MacBook Pro で、CocoaPods 0.35 を入れたときの方法で再び試してみたところ、bundle install
のところで次のようなメッセージが表示されました。
Git error: command `git rev-parse swift` in directory /Users/tomohiro/.bundler/cache/git/CocoaPods-6049bfc5788c095898c3b7bc3f10c42bd3081b2e has failed.
If this error persists you could try removing the cache directory '/Users/tomohiro/.bundler/cache/git/CocoaPods-6049bfc5788c095898c3b7bc3f10c42bd3081b2e'
このエラーメッセージの少し前には『fatal: ambiguous argument 'swift': unknown revision or path not in the working tree.』という表示があったので、どうやら 'swift' という名前のリビジョンか何かが廃止された様子でした。
実際のところ、以前に試した 0.35 の時から CocoaPods のバージョンから上がって 0.36.0.beta になっていることが影響していた様子です。
これについては Gemfile 内の CocoaPods についての表記のところを次のようにすることでエラーを回避できました。
gem 'cocoapods', '>=0.36.beta', :git => 'https://github.com/CocoaPods/CocoaPods.git'