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?
źródło
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.swift
aby byłaRxTest
biblioteką dynamiczną, powinna działać. Możesz to łatwo przetestować, klonującRxSwift
i modyfikując ten wiersz:w:
a następnie przeciągnięcie lokalnej kopii
RxSwift
do 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
RxSwift
społeczność, aby zmieniła swoje produkty na dynamiczne lub sprzedawała wersje dynamiczne oprócz domyślnych.3) Nie używaj
RxTest
ani 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.
źródło