Xcode の Build Phase RunScript で xcfilelist を使う
Carthage 利用時に Input Files が肥大化する問題を、Xcode 10 で追加された Input File Lists(xcfilelist)で整理する方法です。
- 公開日
- 更新日
この記事は別サイトにも掲載しています。 https://qiita.com/iganin/items/a1add30465542c4466fe
注意
本対応は Carthage の v0.31.1 以降でのみ使用可能です。
はじめに
Carthage でライブラリ管理を行うような場合、Build Phases に以下のような RunScript を追加する必要があります。

Carthage を例にとりますと、ここで Input Files に Carthage で導入したライブラリの Build 成果物の Path を記載する必要がありましたが、ライブラリの数が増えると以下のような問題が発生します。
- 単純に記入が手間
- 記入漏れ等に気づきにくい、逆に重複があっても気づきにくい
- 意味のあるまとまり(通信ライブラリ、Alphabet 順など)に整理しづらい
このあたりの仕組みに関して Xcode 10 で改善があったため共有します。
検証環境
以下の環境を使用しています。
- macOS High Sierra Version 10.13.6
- Xcode Version 10.0.0
何が変わったか
先ほどの画像に注目していただくと、Input Files 以外に見慣れない Input File Lists 項目があることに気づかれるかと思います。Xcode 10 にて File だけではなく、xcfilelist を Input や Output として取り扱えるようになりました。 以下、具体的な対応方法を記載します。
対応方法
ここで具体的な対応方法について記載します。
xcfilelist の追加方法
Xcode の File > New > File と辿っていくとよく見る追加ファイル種別の選択画面が表示されます。これを下に辿っていくと Other 内に Build Phase File List という項目があります。こちらを選択することで xcfilelist を追加することができます。

作成直後のファイルの中身は下記のようになります。
# CartfileTargets.xcfilelist
# ReduxSample
#
# Created on 2018/09/20.
# Copyright © 2018年 iganin. All rights reserved.
# This file may be set as an input or output file list for a shell script build phase.
# List file paths below; one per line. These paths will be considered inputs or outputs for the script phase.
# Build settings will be expanded, e.g. $(SRCROOT)/fileName
こちらに先ほどの画像の ResourcePath を追記していきます。 ファイル内はコメント記入もでき、改行も可能なため意味のあるまとまりに分けることもできます。
# CartfileTargets.xcfilelist
# ReduxSample
#
# Created on 2018/09/20.
# Copyright © 2018年 iganin. All rights reserved.
# ReSwift
$(SRCROOT)/Carthage/Build/iOS/ReSwift.framework
# Reactive Libraries
$(SRCROOT)/Carthage/Build/iOS/RxBlocking.framework
$(SRCROOT)/Carthage/Build/iOS/RxCocoa.framework
$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework
最後に作成した xcfilelist を Input Files に追加します。 先ほどと同じライブラリの copy-frameworks RunScript ですが随分とすっきりしました。

所感
以下のメリットがあると考えています。
- 記入漏れや重複記入に気づきやすい
- ファイル内で意味のあるまとまりに分けることができる
- そもそもファイルを分けることができるので、Test 用、社内ライブラリ、社外ライブラリなどでファイルを分割可能
- Enterprise、Product など複数 Scheme で同一のライブラリを読み込んでいる場合などに追加の手間が大きく省ける
今回は Carthage の copy-frameworks でご説明しましたが、他の RunScript フェーズでも同様に使用可能です。 今後は各ファイルを追加するのではなく、xcfilelist に記載し xcfilelist を追加する形が良いのではないでしょうか。
追記(9/21)
手元で実行した際に問題がなかったためうまくいったと判断いたしましたが、DerivedData を消したところ dyld のエラーがでてしまい実行時エラーとなりました。。 上記の方法ではうまくいかない可能性が高いです。。。 何か解決方法をご存知の方は共有いただけますと幸いです。
こちらですが、Carthage が xcfilelist に未対応だったためそもそも現時点では上記方法が使えない状況でした。。 先走ってしまい申し訳ありません 🙇🏻♂️ Carthage が対応されましたら上記対応に変えるのが良さそうです。
追記(10/15)
@k_katsumi さんが対応してくださり、Carthage の 0.31.1 より xcfilelist がサポートされたようです。(ありがとうございます!) 以下、該当のリリースノートになります。
参考
- WWDC - Building Faster in Xcode
- 13 分ごろから本記事記載の内容に関して言及されています