Takahiro Octopress Blog

-1から始める情弱プログラミング

Xcode10以降からは、CocoaPods v1.7.0以上を使ってInput/Output File Listsを活用しよう!

はじめに

CocoaPods はiOSアプリエンジニアであれば誰もが知るライブラリ管理ツールだと思いますが、
v1.7.0 以降では xcfilelistInput/Output File Lists で指定できるようになりました。
( CocoaPods Blog – CocoaPods 1.7.0 Beta! )

Input/Output File Lists とはXcode10で追加された Input / Output Files に代わる、
xcfilelist をパスとして指定できる新たな枠組みです。

既に v1.8.4 までリリースされており、Xcodeも11まで上がっているので今更感はありますが、気になったので少し具体的に差分を見てみました。

CocoaPodsのバージョン比較のためにPodfileを用意

CocoaPods の『 v1.7.0 未満のバージョン』と『 v1.7.0 以上のバージョン』で比較するため、 Podfile を用意します。
因みに、今回の比較で利用したそれぞれのバージョンは下記の通りです。

  • v1.7.0 未満のバージョン: v1.6.1
  • v1.7.0 以上のバージョン: v1.8.4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Podfile
use_frameworks!
platform :ios, '13.0'

target "HogeHogeSample" do
  # Normal libraries
  pod 'Moya'
  pod 'ReSwift'
  pod 'ReSwiftThunk'
  pod 'PromiseKit'

  abstract_target 'Tests' do
    target "HogeHogeSampleTests"
    target "HogeHogeSampleUITests"
  end
end

それでは早速比較をしてみましょう。

v1.6.1の場合

まずは v1.6.1 の方で pod install を実行してみます。
インストール完了後、 Xcode の対象ターゲットから Build Phases > [CP] Embed Pods Frameworks を開いてみましょう。

対象ターゲットのBuild Phases(v1.6.1)

設定状態は、

  • 実行シェルスクリプトとして、 "${PODS_ROOT}/Target Support Files/Pods-HogeHogeSample/Pods-HogeHogeSample-frameworks.sh" が指定されている
  • Input FilesOutput Files にそれぞれパスが指定されている

となっています。

v1.8.4の場合

次に v1.8.4 の方で pod install を実行してみます。
同じく Build Phases > [CP] Embed Pods Frameworks を開いてみましょう。

対象ターゲットのBuild Phases(v1.8.4)

設定状態は、

  • 実行シェルスクリプトとして、 "${PODS_ROOT}/Target Support Files/Pods-HogeHogeSample/Pods-HogeHogeSample-frameworks.sh" が指定されている
  • Input File ListsOutput File Lists にそれぞれパスが指定されている

となっています。

比較結果

比較してみると、
v1.6.1 で利用していた Input / Output Files から v1.8.4 では Input / Output File Lists に変わっていることがわかると思います。

この Input / Output File Lists で指定されているファイルの中身を見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Input File Listsに指定されたファイルの中身
${PODS_ROOT}/Target Support Files/Pods-HogeHogeSample/Pods-HogeHogeSample-frameworks.sh
${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework
${BUILT_PRODUCTS_DIR}/Moya/Moya.framework
${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework
${BUILT_PRODUCTS_DIR}/ReSwift/ReSwift.framework
${BUILT_PRODUCTS_DIR}/ReSwiftThunk/ReSwiftThunk.framework
${BUILT_PRODUCTS_DIR}/Result/Result.framework

// Output File Listsに指定されたファイルの中身
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReSwift.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReSwiftThunk.framework
${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Result.framework

結果、これまで Input / Output Files にベタッと指定していたパスと同じであることがわかると思います。
因みに、上記中身が記載された xcfilelist はプロジェクト自体には組み込まれていません。
ファイルからパスが読み取れさえすれば問題ないので、そのままなのでしょう。

ただし、 Gitxcworkspace も管理する場合は、
この xcfilelistGit にアップロードする必要がありますので注意しましょう。
(プロジェクト内でファイル指定されているので、存在しないとビルドが通らなくなります。)

まとめ

CocoaPods 自体が優秀なため、バージョンアップして pod install を実行することで、
自動的に整合性を取ってくれるはずなので、意識する必要はそんなにないかもしれません。

しかし、こうした変更を理解しておくことで、開発中の想定外の差分に気づけたりすることもあります。
知っておいて損はないことなので、細かいところも注視していけると良いな〜というところで本日はここまで。

参考: CocoaPods Blog – CocoaPods 1.7.0 Beta!

Comments