失敗の記録として残しておきます。
経緯
Amplifyを使用したライブラリを作成し、それをcocoapodsのライブラリとして配布することを考えました。
Amplifyの最新版(2.x)はSwift Package Manager(以下SPM)からしかダウンロードできないため、cocoapodsライブラリインストール後に、SPMの依存関係を解決するというアプローチが良さそうに思い調査をはじめました。
やったこと
cocoapodsライブラリの作成
pod lib create 名前
で作成する方法では、開発対象のライブラリがPods以下に入ってしまいSPMの依存関係を、思ったように追加することができませんでした。
そこで こちらで紹介されているように、まずライブラリ部分をframeworkとして作成することにしました。
frameworkとして作成することでSPMの依存関係もかんたんに追加することができました。
ライブラリを利用する側
cocoapodsの依存関係を解決
以下のように依存関係を追加しpod installしました。
pod 'MyLib', :git => 'git@github.com:hoge/mylib.git', :tag => '0.0.3'
インストール自体は問題なくできますが、当然SPMでインストールされるAmplifyの依存関係が解決されていないので、
import Amplify
しているところで、 No such module 'Amplify'
とエラーになってビルドできません。
post_installでSPMパッケージへの依存を追加
そこで以下のようにpost_installでSPMの依存関係を追加しました。post installするとXcode上は期待通りSPMの依存関係が追加されていました。
post_install do |installer|
installer.pods_project.targets.each do |target|
# 参考
# SPMパッケージを追加
# https://github.com/CocoaPods/CocoaPods/issues/10049#issuecomment-819480131
if target.name == "MyLib"
project = installer.pods_project
pkg = project.new(Xcodeproj::Project::Object::XCRemoteSwiftPackageReference)
pkg.repositoryURL = "https://github.com/aws-amplify/amplify-swift"
pkg.requirement = {
kind: "upToNextMajorVersion",
minimumVersion: "2.0.0"
}
ref = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
ref.package = pkg
ref.product_name = "Amplify"
ref2 = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
ref2.package = pkg
ref2.product_name = "AWSAPIPlugin"
ref3 = project.new(Xcodeproj::Project::Object::XCSwiftPackageProductDependency)
ref3.package = pkg
ref3.product_name = "AWSCognitoAuthPlugin"
target.package_product_dependencies << ref
target.package_product_dependencies << ref2
target.package_product_dependencies << ref3
project.root_object.package_references << pkg
project.save
end
end
end
しかしビルドしてみると依然として No such module 'Amplify'
エラーになってしまいます。
この状況をどうしても解決することができず、今回は SPMに依存する cocoapodsのライブラリを作ることを諦めました。
podプロジェクトでないプロジェクトをワークスペースに追加して、同じようにAmplifyの依存を追加した場合は利用できました。
podプロジェクト以下のターゲットにSPMでインストールする依存関係を追加した場合にうまく動かないようです。
path系も同じように見えるんですけどね。。
podのxcconfigが怪しいかなぁとも思ったのですが、解決できませんでした。
何か知っていたら教えていただけると助かります。
参考
https://forums.swift.org/t/possible-to-use-spm-packages-from-cocoapods-pods-project/53187
https://github.com/CocoaPods/CocoaPods/issues/10049#issuecomment-819480131
https://medium.com/@jeantimex/create-your-own-cocoapods-library-da589d5cd270