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

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

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

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

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

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

```:Podfile（AWSの２ライブラリはコメントアウト）
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 の２ライブラリを追加でインストール。

```: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

**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** の利用は控えておきましょう。