0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【断念】Swift Package Managerに依存するcocoapodsのライブラリを作る

Posted at

失敗の記録として残しておきます。

経緯

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

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?