むかしpod lib createして作ったフレームワークをCarthageにも対応させる

こんばんは、@cosmeアプリや@cosme PROアプリのiOS開発をしているaboyです。

弊社のiOSチームでは、プロジェクトのビルド時間が長いことが課題としてあがっています。この課題に対して様々な方法でアプローチしていて、ライブラリをCocoapods経由からCarthage経由での導入に変えるのもそのひとつです。

今回は、その過程で弊社がOSSとして公開しているLoadMoreTableViewControllerをCarthage対応させようとしたときにちょっとハマったので、その解決策をご紹介します。

はじめに

OSSとして作られていて有名なライブラリはほとんどがCocoapodsとCarthageの両方に対応していますよね。弊社で作成したライブラリはPrivateなものも含め、もともとCocoapodsフレームワークとして作成したのがほとんどでした。

Carthage対応するにあたって色々とググったところ、情報はたくさん出てきました。ただLoadMoreTableViewControllerはちょっと特殊なケースで。。。

というのも調べていくと、どうやらCocoapodsの pod lib create で作られるテンプレートはすでにCarthageに対応しているらしい。。。

食い気味でCocoapodsのリポジトリでissue/PRを探したところ、似たようなissueがあり、たしかにその修正PRがマージされていました!!!2015年に!!!

https://github.com/CocoaPods/pod-template/pull/106

ですが残念ながらLoadMoreTableViewControllerは2015年以前に pod lib create して作られたものなので、その改修が入ってません…。PRの中身を見たところ簡単なことしかやっていなかったので、そのままマネしたところうまくいきました。

やること

まず以下のコマンドで、Pods.xcodeprojへのシンボリックリンクを作ります。

Carthageはシンボリックリンクに対応しています、2015年に。
https://github.com/Carthage/Carthage/pull/489

[aboy] ~/LoadMoreTableViewController/Example/Pods
$ ln -s ./Pods.xcodeproj _Carthage.xcodeproj

次にPodsのスキーマをsharedにします。

以上でCarthage対応は完了です!!!

あとは普通に $ carthage build --no-skip-current で生成されたフレームワークを他のプロジェクトに入れて動作確認したり、CartfileやPodfileではリモートブランチを指定することもできるので、以下のようにすればdevelopやmasterブランチに混ぜる前にCocoapods/Carthageでの動作確認が可能です。

# Podfile
target 'Sample' do
  use_frameworks!

  pod "LoadMoreTableViewController", :git => 'https://github.com/istyle-inc/LoadMoreTableViewController', :branch => 'feature-test'

end
# Cartfile
github "istyle-inc/LoadMoreTableViewController" "feature-test"

おわりに

今回はニッチなケースの解決策を紹介しました。

解決してみればその対応自体はすごく簡単なのですが、ドンピシャな情報になかなかたどり着けなかったので、ここにまとめておきます。ご参考になれば幸いです。

iOSエンジニア、新卒入社4年目 社内腕相撲大会で優勝しました Flutterが趣味