CarthageでInput File Listsにxcfilelistを渡す利点と方法

CarthageでInput File Listsにxcfilelistを渡す利点と方法

Table of Contents

xcfilelistで依存ライブラリを管理すると楽です

この記事はxcfilelistを使ってCarthageの環境を構築する方法と利点について説明します。

Carghageの基本や使い方の詳細は「Carthageの使い方を体系的に理解する 」にまとめてあります。

Carthage公式解説に出てくるxcfilelist

Carthageのインストール解説記事には、xcfilelistを使った解説は見かけません。
大抵Input Filesに直接パスを指定する記事が多いです。
しかし、Carthageの公式ではxcfilelistを使っており、むしろそっちがメインにも見えます。

xcfilelistの正体

xcfilelistはXcodeのファイル一覧を表すファイル・タイプです。
といってもただのテキストファイルです。
テキストエディタでファイルパスを列挙して、ファイル保存時に拡張子を.xcfilelistとするだけです。

xcfilelistを使う場所

公式では英文でxcfilelistを見かけますが、これを使う場所がパッと見では分かりません。
xcfilelistを使う場所は下の画像のInput File ListsOutput File Listです。
この中にxcfilelistのパスを指定します。

XcodeBuildPhaseのCarthage用RunScriptPhase

Input File Listsを使う利点

Input Filesでframeworkのパスを指定するほうが仕組み理解という点では分かりやすいです。 Input File Listsを使う利点がないと使う気にならないと思います。

使う利点は、一度xcfilelistのパスを指定すれば、Run Scriptの使いにくいUIを使わなくて済みます。
またフレームワークの追加や削除時にxcodeprojがフレームワークのリンク設定のみなので衝突時の範囲が狭くなります。

xcfilelistを用意する

xcfilelistはパスさえ合っていればどこに置いても問題ないですが、
他環境でも動くようにまずはgit管理下が必須だと思います。
次に編集しやすさ、環境パスが使える、Xcodeで使うファイルと考えたら
プロジェクトディレクトリ配下に置くことが最適です。

Xcode-Project-Navigator

中身は次のようにInput Filesで指定するパスを並べるだけです。 これを.xcfilelistとして保存すれば準備は整います。 ファイル名は何でもいいです。

$(SRCROOT)/Carthage/Build/iOS/AdjustSdk.framework
$(SRCROOT)/Carthage/Build/iOS/SKPhotoBrowser.framework
$(SRCROOT)/Carthage/Build/iOS/SDWebImage.framework
$(SRCROOT)/Carthage/Build/iOS/AFNetworking.framework
$(SRCROOT)/Carthage/Build/iOS/AdjustSdkWebBridge.framework
$(SRCROOT)/Carthage/Build/iOS/PAYJP.framework
$(SRCROOT)/Carthage/Build/iOS/AdjustSdkIm.framework
$(SRCROOT)/Carthage/Build/iOS/SVProgressHUD.framework
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework

xcfilelistをInput File Listsに渡す

XcodeのBuild PhasesCarthage用スクリプトフェイズのInput File Listsに先程用意した.xcfilelistのパスを指定します。

先程の用意した場所であれば、$(SRCROOT)/$(PROJECT_NAME)/carthage-input-file-list.xcfilelistになります。

XcodeのInputFileLists

Output File Listsもxcfilelistを使う

Output File Listsも同様にxcfilelistとして出力パスを列挙しておけばxcfilelistのパスを指定するだけです。

$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/AdjustSdk.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SKPhotoBrowser.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SDWebImage.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/AFNetworking.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/AdjustSdkWebBridge.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/PAYJP.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/AdjustSdkIm.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SVProgressHUD.framework
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/SwiftyJSON.framework

こちらもInput File Listsと同じ場所場所であればOutput File Listsで指定するパスは、$(SRCROOT)/$(PROJECT_NAME)/carthage-output-file-list.xcfilelistになります。

XcodeのOutputFileLists

Output File Listsを指定する理由

Output FilesOutput File Listsでコピー先のパスを指定しますが、実は指定しなくてもコピー処理は成功し、動作も問題ありません。
なぜ指定するのかは「CarthageのビルドフェイズでOutput Files指定による速度調査 」に詳細をまとめてます。

後からでも対応できる

この対応は、プロジェクトが初期段階でも後からでも対応できます。
ライブラリが多くても手間はそこまで変わりません。

このエントリーをはてなブックマークに追加