Moduł skompilowany ze Swift 5.1 nie może zostać zaimportowany przez kompilator Swift 5.1.2

91

Mam framework (w tym przypadku jest to RxSwift), który skompilowałem za pomocą Xcode 11.0 do tradycyjnego RxSwift.frameworkpakietu stylów

To zaimportowane w porządku do Xcode 11.0, a także 11.1 nigdy nie miało z tym żadnych problemów

Dzisiaj, po wydaniu przez Apple Xcode 11.2, zaktualizowałem i pojawia się błąd:

Moduł skompilowany ze Swift 5.1 nie może zostać zaimportowany przez kompilator Swift 5.1.2

Jestem przyzwyczajony do szybkiego niedopasowania kompilatora i wiem, że mogę po prostu ponownie skompilować RxSwift za pomocą Xcode 11.2 i kontynuować, ale główną cechą Swift 5.1 była stabilność modułu .

Miałem wrażenie, że teraz, gdy mamy stabilność modułów, frameworki nie będą musiały być ponownie kompilowane z każdą nową wersją Xcode, ale najwyraźniej tak nie jest.

Jeśli ktoś mógłby wyjaśnić, co się tutaj dzieje, byłbym bardzo wdzięczny. Czy Xcode 11.2 wykazuje błąd? czy też musiałem jakoś powiedzieć, że chciałem mieć stabilność modułu, kiedy oryginalnie skompilowałem z Xcode 11.0?

Orion Edwards
źródło

Odpowiedzi:

107

OK, okazuje się, jeśli oglądasz wideo WWDC, wyjaśniają to: https://developer.apple.com/videos/play/wwdc2019/416/

Musisz ustawić opcję Build Libraries for Distribution na Yes w ustawieniach kompilacji twojego frameworka, w przeciwnym razie szybki kompilator nie wygeneruje niezbędnych .swiftinterfaceplików, które są kluczem do tego, aby przyszłe kompilatory mogły załadować starą bibliotekę.

To kończy się w pliku project.pbxproj jako:

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

Po ustawieniu tej flagi, środowisko skompilowane za pomocą Xcode 11.0 (swift 5.1) było w stanie używać Xcode 11.2 (swift 5.1.2) i wszystko wydaje się działać poprawnie.

Mam nadzieję, że to pytanie / odpowiedź będzie przydatne jako odniesienie dla każdego, kto nie obejrzał wszystkich filmów WWDC

Jeśli błąd nadal występuje, przejdź do opcji Produkt > Wyczyść folder kompilacji i ponownie skompiluj .

Orion Edwards
źródło
1
Niesamowite! Teraz miejmy nadzieję, że odkryją to wszyscy programiści zewnętrznych platform - ha ha :)
Mihai Fratu,
25
To nie pomaga w moim przypadku. Ustawiłem na „TAK”, ale wciąż pojawia się błąd. Jakieś pomysły?
davidOhara,
3
Pracuję z Carthage i 10 frameworkami ... ish. Czy jest carthagewystarczająco inteligentny, aby pobrać to z mojego pliku .pbxproj lub, jak mówi powyżej @MihaiFratu, czy wszyscy zewnętrzni programiści frameworków muszą to ustawić w swoich projektach ramowych?
nteissler,
9
@davidOhara w moim przypadku miało to związek ze znanym problemem w Xcode 11.2: Jeśli moduł jest zbudowany z BUILD_LIBRARIES_FOR_DISTRIBUTION i zawiera typ publiczny o tej samej nazwie co sam moduł, klienci nie będą mogli go zaimportować. (19481048) (FB5863238) w uwagach do wydania Xcode 11.2: developer.apple.com/documentation/xcode_release_notes/…
Richard Chirino
2
@davidOhara Niestety nie znalazłem obejścia. Dla nas zmiana nazwy klasy również nie jest możliwa, ponieważ jest to główna klasa naszego frameworka i złamałaby kod klienta. Jeśli zbuduję framework przy użyciu Xcode 11.2, to kompiluje się na Xcode 11.2, ale nie kompiluje się na 11.1 lub wcześniejszym. Dzisiejsze wydanie Xcode 11.2.1 GM nie rozwiązało problemu. Oto bilet na szybkie narzędzie do śledzenia problemów na wypadek, gdybyś miał na to oko: bugs.swift.org/browse/SR-11704 Dołączono do niego również radar.
Richard Chirino,
2

Miałem ten sam błąd podczas importowania bibliotek stron trzecich. Naprawiłem to za pomocą łańcuchów narzędzi w Xcode i biorąc wydanie 19 września 2019 r. Tutaj https://swift.org/download/#releases . Potem musiałem ponownie zaimportować biblioteki i działało.

Sergio
źródło
to było najprostsze rozwiązanie dzięki wielu
Krishan Patel
Mam problem z modułem frameworkowym Moduł skompilowany ze Swift 5.1.2 nie może zostać zaimportowany przez Swift 5.2.2 jak możemy rozwiązać ten problem?
Kishan Suthar
0

Możesz użyć Carthage, aby dodać środowisko RxSwift.

Zasadniczo Carthage daje podobny tradycyjny pakiet w stylu RxSwift.framework .

Więc spróbuj carthage update --no-use-binaries.

iMoeNya
źródło
Oddaj głos, ponieważ dzięki Kartaginie przebudowujesz bibliotekę na nowym kompilatorze. Pytanie wyraźnie dotyczy ładowania bibliotek binarnych zbudowanych przez poprzedni kompilator
Orion Edwards
0

To spowodowało, że mój błąd kompilatora zniknął.

  1. carthage bootstrap --platform ios
  2. brew bundle
  3. pod repo update
Rinni
źródło
brew bundle? co to robi?
skywinder
Oddaj głos, ponieważ dzięki Kartaginie przebudowujesz bibliotekę na nowym kompilatorze. Pytanie wyraźnie dotyczy ładowania bibliotek binarnych zbudowanych przez poprzedni kompilator
Orion Edwards