XcodeのBuildPhase RunScript でxcfilelistを使う


注意

本対応はCarthageのv0.31.1以降でのみ使用可能です。


はじめに

Carthageでライブラリ管理を行うような場合、Build Phases に 以下のようなRunScriptを追加する必要があります。

carthage_runscript_before.png

Carthageを例にとりますと、ここでInput FilesにCarthageで導入したライブラリのBuild成果物のPathを記載する必要がありましたが、ライブラリの数が増えると以下のような問題が発生します。


  • 単純に記入が手間

  • 記入漏れ等に気づきにくい、逆に重複があっても気づきにくい

  • 意味のあるまとまり(通信ライブラリ、Alphabet順など)に整理しづらい

このあたりの仕組みに関してXcode10で改善があったため共有します。


検証環境

以下の環境を使用しています。


  • macOS High Sierra Version 10.13.6

  • Xcode Version 10.0.0


何が変わったか

先ほどの画像に注目していただくと、 Input Files以外に見慣れない Input File Lists項目があることに気づかれるかと思います。Xcode10にてFileだけではなく、xcfilelistをInputやOutputとして取り扱えるようになりました。

以下、具体的な対応方法を記載します。


対応方法

ここで具体的な対応方法について記載します。


xcfilelistの追加方法

Xcodeの File > New > File と辿っていくとよく見る追加ファイル種別の選択画面が表示されます。これを下に辿っていくと Other内に Build Phase File List という項目があります。こちらを選択することでxcfilelistを追加することができます。

スクリーンショット 2018-09-20 0.35.41.png

作成直後のファイルの中身は下記のようになります。

#  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ですが随分とすっきりしました。

carthage_runscript_after.png


所感

以下のメリットがあると考えています。


  • 記入漏れや重複記入に気づきやすい

  • ファイル内で意味のあるまとまりに分けることができる

  • そもそもファイルを分けることができるので、Test用、社内ライブラリ、社外ライブラリなどでファイルを分割可能

  • Enterprise、Productなど複数Schemeで同一のライブラリを読み込んでいる場合などに追加の手間が大きく省ける

今回はCarthageのcopy-frameworksでご説明しましたが、他のRunScriptフェーズでも同様に使用可能です。

今後は各ファイルを追加するのではなく、xcfilelistに記載しxcfilelistを追加する形が良いのではないでしょうか。


追記(9/21)

手元で実行した際に問題がなかったためうまくいったと判断いたしましたが、

DerivedDataを消したところdyldのエラーがでてしまい実行時エラーとなりました。。

上記の方法ではうまくいかない可能性が高いです。。。

何か解決方法をご存知の方は共有いただけますと幸いです。

こちらですが、Carthageがxcfilelistに未対応だったためそもそも現時点では上記方法が使えない状況でした。。

先走ってしまい申し訳ありません 🙇🏻‍♂️ Carthangeが対応されましたら上記対応に変えるのが良さそうです。


追記(10/15)

@k_katsumiさんが対応してくださり、Carthageの0.31.1よりxcfilelistがサポートされたようです。(ありがとうございます!)

以下、該当のリリースノートになります。

https://github.com/Carthage/Carthage/releases/tag/0.31.1


参考