はじめに
Carthage はビルド時にXcodeプロジェクトに含まれる全ての共有スキームをビルドするようになっています。そのため、アプリから依存することのないフレームワークのスキームもビルドすることになり、無駄な時間がかかってしまいます。
例えば RxSwift ですと、次の5つのフレームワークのビルドが走ることになりますが、アプリから使用しているのが RxSwift 単体の場合は、無駄に4つのフレームワークをビルドすることになってしまうのです。
- RxSwift
- RxBlocking
- RxRelay
- RxCocoa
- RxTest
この記事では、不要なフレームワークをビルドを除外する方法を紹介します。
ビルドの前に任意の処理を実行する
Carthageで bootstrap
もしくは update
コマンドを実行すると、以下のような 1~3 の手順でビルド処理が進みますが、手順2の後にプロジェクトから不要な共有スキームを取り除くことでビルドをスキップすることができます。
- 依存パッケージのリポジトリをクローン
- ビルド対象となるコミットをチェックアウト 👈 この後に不要な共有スキームを取り除く!
- プロジェクトの各共有スキームのビルド
Carthage の bootstrap
/ update
コマンドでは前述の手順1~3が全て実行されますが、--no-build
オプションを加えることで手順3をスキップすることができます。
また、build
コマンドでは手順3のみを実行することができます。
carthage bootstrap --no-build
# ここで不要な共有スキームを取り除く
carthage build
※
carthage bootstrap --no-builds
相当の処理はcarthage checkout
でも実行できます。
不要な共有スキームを取り除く
Xcodeプロジェクトの共有スキームは以下のパスにファイルとして存在しているので、このファイルを削除するだけでビルドから除外することができます。
{package}.xcodeproj/xcshareddata/xcschemes/{scheme}.xcscheme
RxSwift の RxCocoa のビルドをスキップしたい場合はこうなります。
rm -f ./Carthage/Checkouts/RxSwift/Rx.xcodeproj/xcshareddata/xcschemes/RxCocoa.xcscheme
まとめ
ここまでの内容で必要なものは全て揃いましたので、あとはシェルスクリプトやMakefileでまとめておきましょう。
.PHONY: carthage_bootstrap carthage_update
carthage_bootstrap:
carthage bootstrap --no-build
./bin/exclude_carthage_unused_schemes.sh
carthage build --platform iOS --cache-builds --no-use-binaries --use-xcframeworks
carthage_update:
carthage update --no-build
./bin/exclude_carthage_unused_schemes.sh
carthage build --platform iOS --cache-builds --no-use-binaries --use-xcframeworks
#!/bin/sh
# Carthageの依存パッケージの不要なスキームはビルドしないように除外する
CARTHAGE_CHECKOUTS=$(cd $(dirname $0);cd ../Carthage/Checkouts;pwd)
# ReactiveX/RxSwift の不要なスキームを削除
SCHEMES_DIR="${CARTHAGE_CHECKOUTS}/RxSwift/Rx.xcodeproj/xcshareddata/xcschemes"
rm -f "${SCHEMES_DIR}/RxCocoa.xcscheme"
rm -f "${SCHEMES_DIR}/RxRelay.xcscheme"