はじめに
個々のサンプルプロジェクトでは問題なく動いていたのに、1つのプロジェクトにライブラリをまとめたらハマってしまったので、原因と対策をメモしておきます。
発端
イーサリアム用のライブラリと、AWS 用のライブラリのサンプルをそれぞれ試して導入の目処がたったので、下記の Podfile にて、開発中のプロジェクトへ導入しました。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.2'
target 'AppEnv' do
use_frameworks!
pod 'web3swift'
pod 'AWSAppSync'
pod 'AWSS3'
end
で、サンプルのコードを開発プロジェクトへ取り込んでコンパイルしたところ、web3swift 関連コードでエラーが発生。「あれ?」と思ってフレームワークを見てみると、なぜか頭が大文字にリネーム(?)された Web3swift に差し変わっていてポカンとなりました。
原因
pod install のログをよくみてみたらヒントがありました。
$ pod install
Analyzing dependencies
Downloading dependencies
Installing AWSAppSync (3.1.0)
Installing AWSCore (2.13.1)
Installing AWSS3 (2.13.1)
…省略…
Installing Starscream (3.0.6)
Installing SwiftRLP (1.2)
Installing secp256k1_swift (1.0.3)
Installing web3swift (2.1.2)
Generating Pods project
Integrating client project
web3swift のバージョンが (2.1.2) です。
サンプルでは最新の (2.2.1) だったので、古いバージョンがインストールされたことになります。(※ web3swift が Web3swift にリネームされたように見えたのは、(2.1) → (2.2) のタイミングで、たまたまフレームワーク名が変更されていたからのようでした)
で、2つのサンプルプロジェクトの Podfile.lock を見比べたところ、Starscream が両ライブラリから参照されており、このライブラリのバージョンを AWS 側へあわせるために、web3swift のバージョンが下げられてしまっていたようです。
回避策
コンパイルを通すため、web3swift の最新版がインストールされるように試した結果が下記となります。
まず、インストール済みの関連ファイル(Pods フォルダ、Podfile.lock, プロジェクトのワークスペース)を一旦削除し、下記の内容で web3swift だけをインストールしました。
target 'AppEnv' do
use_frameworks!
pod 'web3swift'
# pod 'AWSAppSync'
# pod 'AWSS3'
end
$ pod install
Analyzing dependencies
Downloading dependencies
Installing BigInt (4.0.0)
Installing CryptoSwift (1.0.0)
Installing PromiseKit (6.8.5)
Installing Starscream (3.1.1)
Installing secp256k1.c (0.1.2)
Installing web3swift (2.2.1)
Generating Pods project
Integrating client project
これで、最新版の、(2.2.1) がインストールされました。
つづいて、AWS の2ライブラリを追加でインストール。
target 'AppEnv' do
use_frameworks!
pod 'web3swift'
pod 'AWSAppSync'
pod 'AWSS3'
end
$ pod install
Analyzing dependencies
Downloading dependencies
Installing AWSAppSync (2.15.0)
Installing AWSCore (2.12.7)
Installing AWSS3 (2.12.7)
Installing ReachabilitySwift (4.3.1)
Installing SQLite.swift (0.12.2)
Generating Pods project
Integrating client project
Starscream と web3swift に変化がなく、AWS 関連のライブラリだけがインストールされていることがわかります。
で、コンパイルも無事通りました。
AWS側のバージョンが若干古くなってしまいましたが、テストした結果、欲しい機能への影響はなかったので一件落着です。
まとめ
異なるライブラリを CocoaPods で一気に導入する際は、ライブラリ間の相性により、全てのライブラリを最新バージョンにできないことがあるようです。もし、期待するバージョンがインストールされなかった場合は、優先度の高いライブラリ側へ合わせて、インストールの順番の調整することで妥協点を探りましょう。
補足
後から導入するライブラリを pod update でインストールするとどうなるでしょうか?
今回の例だと、こんな感じになります。
$ pod update
Analyzing dependencies
Downloading dependencies
Downloading dependencies
Installing AWSAppSync (3.1.0)
Installing AWSCore (2.13.1)
Installing AWSS3 (2.13.1)
…省略…
Installing Starscream 3.0.6 (was 3.1.1)
Installing SwiftRLP (1.2)
Installing secp256k1_swift (1.0.3)
Installing web3swift 2.1.2 (was 2.2.1)
Removing secp256k1.c
Generating Pods project
Integrating client project
pod update により、導入済みのライブラリが「アップデート」され、Starscream が (3.1.1) → (3.0.6) に、 web3swift が (2.2.1) → (2.1.2) に、それぞれデグレードされています(※そのかわり、AWSAppSync と AWSS3 が最新になっています)。
今回のように、既存のライブラリのバージョンを変えられたくない場合、 pod update の利用は控えておきましょう。