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?
quelle
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 sieRxTest
stattdessen eine dynamische Bibliothek ist, sollte sie funktionieren. Sie können dies einfach testen, indem SieRxSwift
diese Zeile klonen und ändern:in:
und ziehen Sie dann die lokale Kopie von
RxSwift
in 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
RxSwift
Community, ihre Produkte zusätzlich zur Standardeinstellung auf dynamische oder dynamische Versionen umzustellen.3) Verwenden Sie
RxTest
oder ä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.
quelle