iOS Xcode SPM nie udało się odformować nadklasy


9

Moja aplikacja składa się z wielu projektów (frameworków), po jednym dla każdej głównej funkcji i wspólnej frameworku z różnego rodzaju rzeczami, do których muszę uzyskać dostęp w wielu moich funkcjach.

Korzystam z Menedżera pakietów Swift pakietu Xcode 11, aby dodać zależności.

Wspólny framework zawiera zależność RxSwift, której używam w całym projekcie.

Napotykam problemy, gdy próbuję użyć RxTest w dowolnej strukturze frameworka.

Jeśli dodam RxTest przez SPM bezpośrednio do celu testowego i uruchomię testy, otrzymam

nie udało się oddzielić nadklasy „nazwy klasy” od zniekształconej nazwy „inna nazwa klasy”

i wiele

Klasa „nazwa klasy” jest zaimplementowana zarówno w „wspólnej ścieżce środowiska”, jak i „ścieżce docelowej testu”

gdzie wszystkie te klasy są związane z Rx. Błąd „nie udało się odkamienić” powoduje zawieszenie testu i występuje tylko wtedy, gdy próbuję zainicjować klasę RxTest.

Jeśli dodam RxTest do wspólnego frameworka, testy działają poprawnie, ale kiedy uruchamiam aplikację, otrzymuję

dyld: Biblioteka nie załadowana: @ rpath / XCTest.framework / XCTest

To ma sens, ponieważ dodałem szkielet testowy do szkieletu nie testowego i nie jest to coś dobrego.

Zasadniczo nie byłem w stanie uzyskać konfiguracji, w której zarówno testy, jak i aplikacja działają poprawnie. Albo uruchomi się aplikacja, albo uruchomią się testy.

Jak mogę to uruchomić? Czy istnieje sposób na włączenie RxTest do wspólnego frameworka tylko wtedy, gdy zbuduję go na testowym celu? A może RxTest powinien być zawarty tylko w testowych obiektach docelowych i brakuje mi konfiguracji?

Odpowiedzi:


2

Xcode z zależnościami SPM nie może obsłużyć tej samej zależności SPM w wielu obiektach docelowych, które są obecnie od siebie zależne. Każda zależność musi być w tej chwili tylko w jednym celu. Na razie nie wiem dlaczego, ale postaram się zbadać więcej i zgłosić błąd, jeśli nie został jeszcze zgłoszony.


Cześć, masz szczęście, aby dowiedzieć się więcej?
janh

Znalazłeś coś na ten temat?
bogen

Jak dotąd nic :) Problem polega na tym, że statycznie łączy zależności w obiektach docelowych.
Zdeněk Topič

0

Twój problem prawdopodobnie polega na tym, że biblioteka używa linkowania statycznego zamiast dynamicznego. W SwiftPM możesz określić bibliotekę jako statyczną lub dynamiczną, jeśli chcesz, lub możesz po prostu pozwolić systemowi kompilacji zdecydować, co zrobi większość pakietów. Wydaje się, że Xcode preferuje podejście statyczne podczas kompilacji za pomocą SwiftPM, co powoduje występowanie problemów z kompilacją.

Jeśli zmodyfikujesz, Package.swiftaby była RxTestbiblioteką dynamiczną, powinna działać. Możesz to łatwo przetestować, klonując RxSwifti modyfikując ten wiersz:

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

w:

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

a następnie przeciągnięcie lokalnej kopii RxSwiftdo twojego Xcode Project Navigator. Następnie użyje lokalnej kopii pakietu zamiast sklonowanej przez Xcode.

Gdy to zrobisz, możesz powiązać go z dowolnymi potrzebnymi celami i powinien on działać. Jeśli to rzeczywiście rozwiązuje problem, prawdopodobnie długoterminowe rozwiązania:

1) Przygotuj widelec, który po prostu zmieni go w bibliotekę dynamiczną.

2) Przekonaj RxSwiftspołeczność, aby zmieniła swoje produkty na dynamiczne lub sprzedawała wersje dynamiczne oprócz domyślnych.

3) Nie używaj RxTestani podobnych rzeczy w wielu miejscach.


Warto również zauważyć, że Xcode 11.3 i wcześniejsze nie obsługują archiwizacji za pomocą dynamicznych pakietów Swift. Więc jeśli pójdziesz dynamiczną trasą, będziesz musiał poczekać na Xcode 11.4.


Klonowanie i modyfikowanie każdej zależności nie wydaje mi się rozwiązaniem. Większość pakietów używa domyślnego typu, który moim zdaniem jest dość automatyczny i za każdym razem z jakiegoś powodu wybiera statyczne linkowanie. Spodziewałbym się, że ponieważ pakiet jest połączony w wiele celów, zdecydowałby się połączyć go dynamicznie.
Zdeněk Topič

Tak, to jest ból. Zgadzam się, że dynamika byłaby tutaj oczekiwanym zachowaniem. Najlepsze, co możemy zrobić, aby to zmienić, to przesłać prośbę o opinię do Apple.
bscothern
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.