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 installpod 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 installbundle exec pod update を行うと、該当するライブラリがフレームワークとして組み込まれ、すぐに利用できるようになります。

今回のSwiftyJSON の場合、名前空間が「SwiftyJSON」で定義されているので、これを使いたいコード内で、次のようにしてモジュールをインポートできます。

import SwiftyJSON

これで、このモジュールに含まれるオブジェクトをJSONSwiftyJSON.JSON のようにして利用できます。

Cocoapods 0.35 の頃の Swift への対応方法

先日に CocaPods 0.35 を Swift に対応させたときには、次の準備が必要になるようでした。

そうして準備ができたら、あとは bundle exec pod installbundle 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 installbundle 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 が使われない』というアドバイスを頂きました。

なるほど、ぜんぜん知らずに使ってました。

何も知らぬまま、画面に指示された通りに 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'