Модуль, скомпилированный с помощью Swift 5.1, не может быть импортирован компилятором Swift 5.1.2

91

У меня есть фреймворк (в данном случае это RxSwift), который я скомпилировал с использованием Xcode 11.0 в традиционный RxSwift.frameworkпакет стилей

Это нормально импортируется в Xcode 11.0, а также 11.1 никогда не было проблем с ним

Сегодня, после выпуска Apple Xcode 11.2, я обновился, и мне сообщают об ошибке:

Модуль, скомпилированный с помощью Swift 5.1, не может быть импортирован компилятором Swift 5.1.2

Я привык быстро компилировать несоответствия компиляторов и знаю, что могу просто перекомпилировать RxSwift с использованием Xcode 11.2 и продолжить, но главной особенностью Swift 5.1 была стабильность модуля .

У меня сложилось впечатление, что теперь, когда у нас есть стабильность модуля, фреймворкам не нужно будет перекомпилироваться с каждым новым выпуском XCode, но это явно не так.

Если кто-нибудь может объяснить, что здесь происходит, я был бы очень признателен. Xcode 11.2 показывает ошибку? или мне как-то нужно было сказать, что я хотел стабильности модуля при первоначальной компиляции с Xcode 11.0?

Орион Эдвардс
источник
Для меня Toolchain с более старой версией
Swift

Ответы:

108

Хорошо, оказывается, если вы смотрите видео WWDC, они объясняют это: https://developer.apple.com/videos/play/wwdc2019/416/

Вам необходимо установить для параметра « Сборка библиотек для распространения» значение « Да» в настройках сборки вашего фреймворка, иначе быстрый компилятор не сгенерирует необходимые .swiftinterfaceфайлы, которые будут ключом к тому, чтобы будущие компиляторы могли загружать вашу старую библиотеку.

Это заканчивается в вашем файле project.pbxproj как:

BUILD_LIBRARY_FOR_DISTRIBUTION = YES;

После установки этого флага платформа, которую я скомпилировал с использованием Xcode 11.0 (swift 5.1), могла использоваться Xcode 11.2 (swift 5.1.2), и все, кажется, работает правильно.

Надеюсь, этот вопрос / ответ послужит полезным справочным материалом для всех, кто не смотрел все видео WWDC.

Если ошибка не устранена, перейдите в Product > Clean Build Folder и выполните Build снова.

Орион Эдвардс
источник
1
Потрясающие! Теперь давайте надеяться, что все сторонние разработчики фреймворков обнаружат это - ха-ха :)
Михай Фрату
25
Это не помогает в моем случае. Я установил «ДА», но все еще получаю ошибку. Любые идеи?
Давид Охара
3
Я работаю с Карфагеном и 10 фреймворками ... иш. carthageДостаточно ли умен, чтобы взять это из моего файла .pbxproj , или, как говорит @MihaiFratu выше, все сторонние разработчики фреймворка должны сами устанавливать это в своих проектах фреймворков?
nteissler
9
@davidOhara в моем случае это было связано с этой известной проблемой в Xcode 11.2: если модуль построен с помощью BUILD_LIBRARIES_FOR_DISTRIBUTION и содержит открытый тип с тем же именем, что и сам модуль, клиенты не смогут импортировать модуль. (19481048) (FB5863238) в заметках о выпуске Xcode 11.2: developer.apple.com/documentation/xcode_release_notes/…
Ричард
2
@davidOhara К сожалению, я не нашел обходного пути. Для нас переименование класса также невозможно, так как это основной класс нашей инфраструктуры, который нарушает код нашего клиента. Если я собираю фреймворк, используя Xcode 11.2, то он компилируется в Xcode 11.2, но не компилируется в 11.1 или более ранней. Сегодняшний выпуск Xcode 11.2.1 GM не устранил проблему. Вот билет на быстрый трекер проблем, если вы хотите следить за ним: bugs.swift.org/browse/SR-11704 К нему также прикреплен радар.
Ричард Чирино
2

У меня была такая же ошибка при импорте сторонних библиотек. Я исправил это, используя наборы инструментов в XCode и взяв релиз 19 сентября 2019 года здесь https://swift.org/download/#releases . После этого мне пришлось повторно импортировать мои библиотеки, и это работало.

Sergio
источник
это было самое простое решение, спасибо
Кришан Патель
У меня проблема с фреймворком Модуль, скомпилированный с помощью Swift 5.1.2, не может быть импортирован Swift 5.2.2. Как мы можем решить эту проблему?
Кишан Сутар
0

Вы можете использовать Carthage для добавления фреймворка RxSwift.

По сути, Carthage предоставляет вам аналогичный традиционный пакет в стиле RxSwift.framework .

Тогда попробуй carthage update --no-use-binaries.

iMoeNya
источник
Даунвот, потому что с Carthage вы просто перестраиваете свою библиотеку на новом компиляторе. Вопрос явно касается загрузки бинарных библиотек, созданных предыдущим компилятором
Orion Edwards
0

Это заставило мою ошибку компилятора исчезнуть.

  1. carthage bootstrap --platform ios
  2. brew bundle
  3. pod repo update
Rinni
источник
brew bundle? Что это делает?
небесный ветер
Downvote, потому что с Carthage вы перестраиваете свою библиотеку на новом компиляторе. Вопрос явно касается загрузки бинарных библиотек, созданных предыдущим компилятором
Orion Edwards