The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

static libraryをつかったマルチモジュール環境でCocoaPodsとSwiftPackageManagerを混在させる

このようにアプリの一部のモジュールをstatic libraryに切り出し、それぞれでCocoaPods経由でライブラリを使っているケースで、Swift Package Manager経由でライブラリを使いたいときの対処法です。

モジュール分割したどちらか一方でのみSwift Package Manager経由でライブラリを追加する場合は普通にXcodeのPackage Dependenciesを使えばよいです。

上の図のライブラリBように複数のtargetから使われているライブラリをSwift Package Managerにしたい場合、XcodeのPackage Dependenciesで複数のtargetに追加すると duplicate symbols for architecture.. となってしまったりする場合があると思います。

対策

そういった場合はライブラリをラップするフレームワークをつくり、そのフレームワークを各モジュールから使うようにするとうまくいきます。

例えばTCAを全Targetから使いたい場合ですが、 まずラップするフレームワークとしてtargetにPackageContainerというフレームワークを追加し、そのフレームワークにSPMで追加したTCAをFramework&Libraryで追加します。

そして各targetのFramework&LibraryにPackageContainerを追加すれば完了です。

すべてSwift Package Managerにすることはできず、一部CocoaPodsにしないといけない場合などにどうぞ。