PIYO - Tech & Life -

CocoaPodsのライブラリを編集して使いたいとき

CocoaPods iOS GitHub

この間書いたように、mwaterfall/MWFeedParserというCocoaPodsでも扱えるRSSフィード解析のライブラリに機能が足りなくて困ったのですが、実装が簡単だったこともあってささっと書いてプルリクを出しておきました。

ところが、このプルリクエストがすぐにマージされたとしてもCocoaPodsで参照できるバージョンがすぐに変わるとは限りませんし、現時点ではプルリクは完全にスルーされているのでforkを使うしかありません。

PodfileでGitリポジトリを指定

CocoaPods(およびPodfile)には、CocoaPodsに登録されていないバージョンを使うための記述が用意されています。このあたりはRubyのgemと同じような仕組みになっているようですね。

今回のケースでいうと、元々はPodfileこのような記述をしていたところを、

pod 'MWFeedParser'

↓のように書き換えます。

pod 'MWFeedParser', :git => "https://github.com/pi-chan/MWFeedParser.git", :branch => "usable"

:git指定でリポジトリのURLを、:branchで対象ブランチを指定できます。何も指定しなければmasterを使います。

これで$ pod installをすれば全てうまくいく、というわけです。

うまくいかないケース

先ほど紹介したMWFeedParserのケースではまくいくのですが、そうでないケースも多々ありそうです。というのは、リポジトリがそのままCocoaPodsに使える構成になっていないこともあるからです。

例えば上に引っ張って更新するコントロールのためのpilot34/MNMBottomPullToRefreshは、Forkしたリポジトリを指定しても正しくインストールしてくれません。

このような場合はForkリポジトリ専用のpodspecを用意してあげるしかありません。

podspecを探す

CocoaPodsに登録されているすべてのpodspecはここにあります。

CocoaPods/Specs

ここから探せばいいのですが数が多くて探すのも一手間かかるので、MNMBottomPullToRefresh podspecなどとGoogleで検索するのが早いでしょう。

Specs/MNMBottomPullToRefresh/0.0.1/MNMBottomPullToRefresh.podspec at master · CocoaPods/Specs

で、出てきたpodspecをGistなどのパブリックなところに置きます。実際に僕が使っているのがこれ。

MNMBottomPullToRefresh.podspec

元のpodspecと変えたところが一箇所あります。

# 変更前
s.source = { :git => "https://github.com/emenegro/bottom-pull-to-refresh.git", :commit => '82d5fed6dd7f4a4df531a6954398b60b9aecec6d' }

# 変更後
s.source = { :git => "https://github.com/pi-chan/bottom-pull-to-refresh.git", :branch => 'custom-text' }

リポジトリを自分のForkに書き換え、:commit指定の代わりにブランチ指定に変えてあげました。もちろん:commitをそのまま使ってもいいですが。

そしてPodfileをこのように書き換えます。今度はpodspecを直で指定してあげます。このときはgistのrawのURLを使ってください。

# 変更前
pod 'MNMBottomPullToRefresh'

# 変更後
pod 'MNMBottomPullToRefresh', :podspec => "https://gist.githubusercontent.com/xoyip/9225911/raw/a2b35c7bf1b6d207402f6400f4386f6900fe2ac8/MNMBottomPullToRefresh.podspec"

まとめ

  • 拡張したかったらforkする
  • Podfileをリポジトリ、ブランチorコミット指定にする
  • だめならpodspecを書き換えてpodspec指定!