LoginSignup
0
3

More than 3 years have passed since last update.

【Xcode】CocoaPods で複数ライブラリを導入したらハマった話

Last updated at Posted at 2020-03-28

はじめに

個々のサンプルプロジェクトでは問題なく動いていたのに、1つのプロジェクトにライブラリをまとめたらハマってしまったので、原因と対策をメモしておきます。

発端

イーサリアム用のライブラリと、AWS 用のライブラリのサンプルをそれぞれ試して導入の目処がたったので、下記の Podfile にて、開発中のプロジェクトへ導入しました。

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) だったので、古いバージョンがインストールされたことになります。(※ web3swiftWeb3swift にリネームされたように見えたのは、(2.1)(2.2) のタイミングで、たまたまフレームワーク名が変更されていたからのようでした)

で、2つのサンプルプロジェクトの Podfile.lock を見比べたところ、Starscream が両ライブラリから参照されており、このライブラリのバージョンを AWS 側へあわせるために、web3swift のバージョンが下げられてしまっていたようです。

回避策

コンパイルを通すため、web3swift の最新版がインストールされるように試した結果が下記となります。

まず、インストール済みの関連ファイル(Pods フォルダ、Podfile.lock, プロジェクトのワークスペース)を一旦削除し、下記の内容で web3swift だけをインストールしました。

Podfile(AWSの2ライブラリはコメントアウト)
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ライブラリを追加でインストール。

Podfile(AWSのコメントを外して有効に)
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

Starscreamweb3swift に変化がなく、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) に、それぞれデグレードされています(※そのかわり、AWSAppSyncAWSS3 が最新になっています)。

今回のように、既存のライブラリのバージョンを変えられたくない場合、 pod update の利用は控えておきましょう。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3