これは何
以下のリポジトリの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つは手作業と指差し確認が必要ですね。
不要なFetchが走り、しかもキャンセルできない
例えばライブラリ1つだけを更新したくて carthage update CircleProgressButton
をしても、 Cartfile
にある全部のリポジトリをfetchしてしまいます。
もちろん依存関係がある場合に必要なのはわかるのですが、明らかに依存がないことがわかっている場合は、不要な処理ですよね。私の環境だと特にRxSwiftのfetchが延々終わらないことがあったので、そうなると結構辛いです。
しかも間違ってもControl+Cでキャンセルしてはいけません。NSTaskはchild processをkillすることができないらしく、非同期のfetch&buildのプロセスがゾンビ化します。しかもガンガン標準出力に書いてきます。やめてくれ。。
こうなると、 ps
して kill
するか、終わるまでおとなしく待つしかなくなります。
解決策
carthage/update
https://github.com/toshi0383/scripts/blob/master/carthage/update
このスクリプトは上で挙げた課題のうち以下の2つに対応しつつ、 carthage update
を実行します。
- 更新時に古いbcsymbolmapを探して削除する
- CodeCoverage設定問題
どうしても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で確認しました。