iOS Xcode SPM konnte die Superklasse nicht entwirren

9

Meine App besteht aus vielen Projekten (Frameworks), einem für jedes Hauptfeature und einem gemeinsamen Framework mit allen möglichen Dingen, auf die ich in mehreren meiner Features zugreifen muss.

Ich verwende den Swift Package Manager von Xcode 11, um Abhängigkeiten hinzuzufügen.

Das gemeinsame Framework enthält eine RxSwift-Abhängigkeit, die ich im gesamten Projekt verwende.

Ich habe Probleme, wenn ich versuche, RxTest in einem meiner Feature-Frameworks zu verwenden.

Wenn ich RxTest über SPM direkt zum Testziel hinzufüge und die Tests ausführe, erhalte ich

Die Superklasse 'Klassenname' konnte nicht aus dem verstümmelten Namen 'Anderer Klassenname' entfernt werden.

und viele

Die Klasse 'Klassenname' ist sowohl im 'Common Framework Path' als auch im 'Test Target Path' implementiert.

wo alle diese Klassen Rx-bezogen sind. Der Fehler "Fehler beim Entwirren" stürzt den Test ab und tritt nur auf, wenn ich versuche, eine RxTest-Klasse zu initialisieren.

Wenn ich RxTest zum allgemeinen Framework hinzufüge, laufen die Tests einwandfrei, aber wenn ich die App ausführe, bekomme ich

dyld: Bibliothek nicht geladen: @ rpath / XCTest.framework / XCTest

Was Sinn macht, weil ich einem Nicht-Test-Framework ein Test-Framework hinzufüge und es nicht gut ist, dies zu tun.

Im Grunde konnte ich keine Konfiguration erhalten, in der sowohl die Tests als auch die App einwandfrei funktionieren. Entweder wird die App ausgeführt oder die Tests werden ausgeführt.

Wie kann ich das zum Laufen bringen? Gibt es eine Möglichkeit, RxTest nur dann in das allgemeine Framework aufzunehmen, wenn ich es auf einem Testziel aufbaue? Oder sollte RxTest nur in den Testzielen enthalten sein und mir fehlt eine Konfiguration?

dtmokada
quelle

Antworten:

2

Xcode mit SPM-Abhängigkeiten kann nicht dieselbe SPM-Abhängigkeit in mehreren Zielen verarbeiten, die derzeit voneinander abhängig sind. Jede Abhängigkeit muss sich momentan nur auf ein einzelnes Ziel beziehen. Ich weiß noch nicht warum, aber ich werde versuchen, mehr zu untersuchen und Fehler zu melden, wenn es noch nicht abgelegt ist.

Zdeněk Topič
quelle
Hallo, hast du Glück, mehr herauszufinden?
Janh
Hast du etwas darüber herausgefunden?
Bogen
Bisher nichts :) Das Problem ist wirklich, dass es die Abhängigkeiten statisch in den Zielen verknüpft.
Zdeněk Topič
0

Ihr Problem ist wahrscheinlich, dass die Bibliothek statische Verknüpfungen anstelle von dynamischen Verknüpfungen verwendet. In SwiftPM können Sie eine Bibliothek als statisch oder dynamisch angeben, wenn Sie möchten, oder Sie können das Build-System einfach entscheiden lassen, was die meisten Pakete tun. Xcode scheint den statischen Ansatz zu bevorzugen, wenn es mit SwiftPM erstellt wird, was zu den Build-Problemen führt, die auftreten.

Wenn Sie die so ändern Package.swift, dass sie RxTeststattdessen eine dynamische Bibliothek ist, sollte sie funktionieren. Sie können dies einfach testen, indem Sie RxSwiftdiese Zeile klonen und ändern:

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

in:

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

und ziehen Sie dann die lokale Kopie von RxSwiftin Ihren Xcode Project Navigator. Es wird dann Ihre lokale Kopie des Pakets anstelle der von Xcode geklonten verwendet.

Sobald Sie dies getan haben, können Sie es mit allen Zielen verknüpfen, die Sie benötigen, und es sollte funktionieren. Wenn das Problem dadurch tatsächlich behoben wird, sind Ihre langfristigen Lösungen wahrscheinlich:

1) Haben Sie eine Verzweigung, die es einfach in eine dynamische Bibliothek ändert.

2) Überzeugen Sie die RxSwiftCommunity, ihre Produkte zusätzlich zur Standardeinstellung auf dynamische oder dynamische Versionen umzustellen.

3) Verwenden Sie RxTestoder ähnliche Dinge nicht an mehreren Stellen.


Es ist auch erwähnenswert, dass Xcode 11.3 und frühere Versionen die Archivierung mit dynamischen Swift-Paketen nicht unterstützen. Wenn Sie also den dynamischen Weg gehen, müssen Sie auf Xcode 11.4 warten.

bscothern
quelle
Das Klonen und Ändern jeder Abhängigkeit scheint mir jedoch keine Lösung zu sein. Die meisten Pakete verwenden den Standardtyp, der meiner Meinung nach etwas automatisch ist und aus irgendeinem Grund jedes Mal eine statische Verknüpfung wählt. Ich würde erwarten, dass das Paket, da es in mehreren Zielen verknüpft ist, es dynamisch verknüpfen würde.
Zdeněk Topič
Ja, es ist ein Schmerz. Ich bin damit einverstanden, dass Dynamik hier das erwartete Verhalten ist. Das Beste, was wir tun können, um dies zu ändern, ist die Einreichung einer Feedback-Anfrage bei Apple.
bscothern