iOS Xcode SPM无法分解超类


9

我的应用程序由许多项目(框架)组成,每个主要功能一个,而一个通用框架包含我需要在多个功能中访问的各种内容。

我正在使用Xcode 11的Swift Package Manager添加依赖项。

通用框架包含一个RxSwift依赖项,我在整个项目中都会使用它。

当我尝试在任何功能框架中使用RxTest时遇到问题。

如果我通过SPM将RxTest直接添加到测试目标并运行测试,我会得到

无法将“类名”的超类与损坏的名称“其他类名”进行分解

还有很多

类“类名”在“通用框架路径”和“测试目标路径”中均实现

所有这些类都与Rx有关。“无法解贴”错误使测试崩溃,并且仅在我尝试初始化RxTest类时发生。

如果我将RxTest添加到通用框架,则测试可以正常运行,但是当我运行应用程序时,

dyld:库未加载:@ rpath / XCTest.framework / XCTest

这是有道理的,因为我要在非测试框架中添加测试框架,这并不是一件好事。

因此,基本上,我无法获得测试和应用都能正常运行的配置。应用程序运行或测试运行。

我该如何工作?仅当我在测试目标上构建RxTest时,才可以将其包含在通用框架中吗?还是应该仅将RxTest包含在测试目标上,而我缺少一些配置?

Answers:


2

具有SPM依赖关系的Xcode现在不能在多个相互依赖的目标中处理相同的SPM依赖关系。目前,每个依赖项仅需要位于单个目标中。我现在不知道为什么,但是如果它尚未归档,我将尝试进行更多调查并归档bug。


嗨,发现更多运气了吗?
1

对此有发现吗?
bogen

到目前为止,什么都没有:)问题实际上是,它在目标中静态链接了依赖项。
兹德涅克话题

0

您的问题可能是库正在使用静态链接而不是动态链接。在SwiftPM中,您可以根据需要将库指定为静态库或动态库,也可以让构建系统决定大多数软件包的作用。Xcode使用SwiftPM进行构建时似乎偏爱静态方法,这会导致您遇到构建问题。

如果您将修改Package.swift为具有RxTest动态库,则应该可以使用。您可以通过克隆RxSwift和修改以下行来轻松测试:

.library(name: "RxTest", targets: ["RxTest"]),

变成:

.library(name: "RxTest", type: .dynamic, targets: ["RxTest"]),

然后将的本地副本拖到RxSwiftXcode Project Navigator中。然后它将使用您的软件包的本地副本,而不是Xcode克隆的副本。

完成此操作后,您可以将其链接到所需的任何目标,并且应该可以正常工作。如果确实能解决问题,那么您的长期解决方案可能是:

1)拥有一个将其简单地更改为动态库的fork。

2)说服RxSwift社区将其产品更改为动态版本或除默认版本外出售动态版本。

3)不要RxTest在多个地方使用或类似的东西。


还值得注意的是,Xcode 11.3和更早版本不支持使用动态Swift软件包进行归档。因此,如果沿着动态路线走下去,您将不得不等待Xcode 11.4。


克隆和修改每个依赖关系似乎并不是我的解决方案。大多数软件包都使用默认类型,我相信这是自动的,出于某种原因每次都会选择静态链接。我希望由于该程序包已链接到多个目标,因此它将选择动态链接。
兹德涅克话题

雅,这很痛苦。我同意动态是这里的预期行为。我们要做的最好的改变就是向Apple提出反馈请求。
bscothern
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.