Swift 包管理器 (SPM) 和 Cocoapod 依赖项冲突

Mic*_*tin 8 cocoapods firebase swift swift-package-manager google-mlkit

概述

我有两个依赖项,一个作为 Swift 包提供,另一个仅作为 Cocoapod 提供。问题是每个版本都依赖于第三个包,这会导致存在多个版本时出现未定义的行为。

在基本层面上,这是我的依赖项的图形

APP imports:
  B (SPM) imports:
    C (SPM) imports:
      D (SPM) <-
  E (Pod) imports:
    D (Pod) <-
Run Code Online (Sandbox Code Playgroud)

我想删除该版本并通过 Podfile 脚本或构建脚本D (Pod)指向该版本。D (SPM)


更具体的信息:

我有一个导入的 NetworkingService Swift 包Firebase,我的主应用程序导入 NetworkingService。我的 Podfile 导入GoogleMLKit/PoseDetection. Firebase 和 PoseDetection 共享依赖项,当存在重复项时,这些依赖项会导致未定义的行为(运行时崩溃)。

注意:通过删除中间 NetworkingService 包并将 Firebase 作为 Swift 包导入主应用程序,应该可以重现此错误。

Podfile

platform :ios, '15.0'

target 'MyApp' do
  use_frameworks!
  pod 'GoogleMLKit/PoseDetection', '2.5.0'
end
Run Code Online (Sandbox Code Playgroud)

在 Package.swift 中

.package(
  name: "Firebase",
  url: "https://github.com/firebase/firebase-ios-sdk.git",
  .upToNextMajor(from: "8.10.0")
),
Run Code Online (Sandbox Code Playgroud)

它们复制了一些依赖项,包括GoogleUtilitiesFBLPromises。崩溃后启动应用程序pod install并出现运行时异常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FBLPromise HTTPBody]: unrecognized selector sent to instance 0x6000017685d0'
Run Code Online (Sandbox Code Playgroud)

通过搜索,我找到了这个GitHub 问题,其中一位贡献者提到:

重复的警告表明存在不确定性行为。当一个库有多个副本时,可能会也可能不会选择正确的一个。

然后,我尝试使用我在另一个 StackOverflow 帖子上找到的链接的脚本的修改版本来重构所有 Cocoapod 依赖项。尝试使 PoseDetection 显式指向GoogleUtilitiesCopy和中的符号FBLPromisesCopy。但似乎即使这些副本的存在,尽管指向相应的依赖关系,也会产生未定义的行为。


部分解决方法

如果我pod install跟着跑File > Packages > Update to latest package versions。该应用程序将启动,而不会立即运行时崩溃。但是,我稍后在应用程序中遇到其他运行时崩溃。***


理想的解决方案

我想删除重复的 pod 依赖项,并通过 Podfile 或构建阶段脚本指向 SPM 版本,但我不确定从哪里开始。

Firebase 可以作为 pod 导入,但我不想这样做,因为我有一个依赖于 Firebase 的现有 SPM 基础设施。我不想将所有这些包转换为 Pod。

Xco*_*OOB 1

SPM和Cocapods的主要问题是:SPM不知道Cocapods,而Cocapods不知道SPM。

我也遇到过类似的情况:

  • pod 库依赖于一些库网络
  • SPM 库也依赖于相同的库网络。

我认为有两个解决方案值得尝试。

1.) 删除 pod 并尝试使用它的 XCFramework 版本(应该可用)。这意味着您应该手动将库添加到您的项目中,并且应根据需要选择它作为嵌入和签名。

2.) 您可以使用简单的二进制目标将 pod 库转换为 SPM。基本上,您需要创建一个指向 XCFramework 存档版本的包文件(因此它应该是一个 zip 文件)。这样 SPM 图将自行处理。

我知道这并不理想,但这两种方法对我有用。