Carthageユーザ必携の便利スクリプトを公開しました

これは何

以下のリポジトリのcarthageディレクトリ以下に便利ツールを公開しました。
https://github.com/toshi0383/scripts

cmdshelfでのご利用が一部必須になっています。この機会にどうぞ。
https://github.com/toshi0383/cmdshelf

Carthageのイケてないところ

まずはなぜこういうものが必要だったのかの動機についてです。

手作業多い

CocoaPodsだと自動でやってくれるようなことも、Carthageでは手作業が必要になります。 単純なことしかしないのがいいところなのですが、例えば以下のような作業は結構面倒なものです。

  • ライブラリ追加/削除時にBuild Phaseに carthage copy-frameworks を追加/削除する
  • 更新時に古いbcsymbolmapを探して削除する
  • CodeCoverage設定問題

XcodeGenを使うと1つ目は気にしなくて良くなるのですが、どうしても後の2つは手作業と指差し確認が必要ですね。

追記あり

*1

不要なFetchが走り、しかもキャンセルできない

例えばライブラリ1つだけを更新したくて carthage update CircleProgressButton をしても、 Cartfile にある全部のリポジトリをfetchしてしまいます。
もちろん依存関係がある場合に必要なのはわかるのですが、明らかに依存がないことがわかっている場合は、不要な処理ですよね。私の環境だと特にRxSwiftのfetchが延々終わらないことがあったので、そうなると結構辛いです。
しかも間違ってもControl+Cでキャンセルしてはいけません。NSTaskはchild processをkillすることができないらしく、非同期のfetch&buildのプロセスがゾンビ化します。しかもガンガン標準出力に書いてきます。やめてくれ。。
こうなると、 ps して kill するか、終わるまでおとなしく待つしかなくなります。

*2

解決策

carthage/update

https://github.com/toshi0383/scripts/blob/master/carthage/update

このスクリプトは上で挙げた課題のうち以下の2つに対応しつつ、 carthage update を実行します。

どうしてもbcsymbolmapが見つからない場合もあるので、そういう場合はメッセージを出力してます。

またCodeCoverage問題が見つかった場合自動で直しますが、その場合ライブラリ管理者に連絡するよう促しています。

上記のライブラリはcodeCoverageEnabled = YESになっていました。ライブラリ管理者に連絡するべきかもしれません。

carthage/update-with-hack.sh

https://github.com/toshi0383/scripts/blob/master/carthage/update-with-hack.sh

こちらはまずCartfileとCartfile.resolvedをいじることで指定されたライブラリ以外を見ないようにして、その上で carthage/update を実行します。終わったらちゃんとCartfileとCartfile.resolvedは元に戻して、更新を反映します。

基本的にはどちらも carthage update と書くのと同じ感覚で

cmdshelf run carthage/update
cmdshelf run carthage/update-with-hack.sh CircleProgressButton

とか書いてもらえれば便利に使えます。 tvOSの場合は

PLATFORM=tvOS cmdshelf run carthage/update-with-hack.sh CircleProgressButton

のようにプロセスに環境変数を渡します。

まあどちらのスクリプトも泥臭い処理をベタベタ書いてるだけなので、ここでの解説は省きます。 各スクリプト冒頭にドキュメントがあるので気になる方はご確認ください。

まとめ

仕事で必要に駆られて作ったものですが、公開したほうが色々いいことがあると思うので、公開できない部分は削除した上でとりあえず公開しました。

AbemaTVのiOSチームでは、Carthageライブラリ更新の際は必ず上の cmdshelf run carthage/update を使うことになっています。

内部的に --use-binaries--use-ssh を指定しているので、運用と合わない場合はごめんなさい。

多分みなさんも似たようなスクリプトを書いて運用されているとは思うので、「こうしたほうがいい」や「もっといいツールがある」などあればぜひ教えてください。
ツッコミや質問などブコメTwitterで受け付けますのでお気軽にどうぞ。
リポジトリへのプルリクもお待ちしています。

*1:0.26.0以降のCarthageでは、CodeCoverage設定問題は解決しているようです。 https://github.com/Carthage/Carthage/issues/2056#issuecomment-329971591

*2:今 carthage update --platform ios CircleProgressButton をやってみたら不要なFetchが終わらなくなることはなかったので、もしかしたら最新版では挙動改善したのかもしれません。Carthage 0.28.0で確認しました。