Интерфейс XCFramework .swift прерывает компиляцию при импорте с помощью Swift Package Manager

Создал пакет Swift (// swift-tools-version: 5.3.0) для XCFramework. Этот пакет зависит от 4 других пакетов Swift (2 из них используют swift-tools-version ‹5, а 2 -› = 5.0). Он строится и запускается в целевой демо-версии приложения проекта. Сгенерированный XCFramework скопирован в репозиторий Swift Package и размещен на GitHub.

Затем я создаю новый проект, и пакет Swift можно успешно импортировать в него через SPM. Зависимости также импортируются.

При создании нового проекта моя структура не может быть скомпилирована из-за ошибки в сгенерированном моей инфраструктуре файле .swiftinterface, «XMLIndexerDeserializable» не является типом члена «SWXMLHash»:  'XMLIndexerDeserializable' не является типом члена 'SWXMLHash'

Может ли кто-нибудь пролить свет на эту ошибку? Не уверен, что это проблема с моей упакованной платформой, проблема с конфигурацией нового проекта, который ее импортирует, или ошибка из-за разницы в версии инструментов Swift. зависимостей.

Некоторые общие сведения о моей конфигурации и процессе

Конфигурация моего пакета Swift:

// swift-tools-version:5.3.0
import PackageDescription
let package = Package(
    name: "MyPackage",
    platforms: [
        .iOS(.v9)
    ],
    products: [
        .library(
            name: "MyPackage", 
            targets: ["MyPackage"])
    ],
    dependencies: [
        .package(name: "CryptoSwift", url: "https://github.com/krzyzanowskim/CryptoSwift", .upToNextMinor(from: "1.2.0")),
        .package(name: "Alamofire", url: "https://github.com/Alamofire/Alamofire", .upToNextMinor(from: "4.8.2")),
        .package(name: "AEXML", url: "https://github.com/tadija/AEXML", .upToNextMinor(from: "4.4.0")),
        .package(name: "SWXMLHash", url: "https://github.com/drmohundro/SWXMLHash", .upToNextMinor(from: "4.9.0"))
    ],
    targets: [
        .binaryTarget(
            name: "MyPackage",
            path: "MyPackage.xcframework")
    ]
)

Смотрел сессии WWDC 2019 и 2020 по созданию XCFrameworks / двоичных файлов для SPM, а также другие различные руководства. Использовал следующий сценарий sh для создания XCFramework, который будет использоваться для моего размещенного пакета Swift:

xcodebuild archive \
  -scheme MyPackage \
  -sdk iphoneos \
  -archivePath "./XCFrameworkArchives/ios_devices.xcarchive" \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
  SKIP_INSTALL=NO
  
xcodebuild archive \
  -scheme MyPackage \
  -sdk iphonesimulator \
  -archivePath "./XCFrameworkArchives/ios_simulators.xcarchive" \
  BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
  SKIP_INSTALL=NO

xcodebuild -create-xcframework \
  -framework ./XCFrameworkArchives/ios_devices.xcarchive/Products/Library/Frameworks/MyPackage.framework \
  -framework ./XCFrameworkArchives/ios_simulators.xcarchive/Products/Library/Frameworks/MyPackage.framework \
  -output ./XCFrameworkArchives/MyPackage.xcframework

XCFramework копируется в мой репозиторий Swift Package, помещается на GitHub и помечается тегами.

Затем я создал новый проект, использовал SPM для добавления зависимости и вытащил MyPackage вместе с зависимостями.

Добавьте код для импорта MyPackage и используйте его. Попытка собрать проект вызывает ошибку компиляции, из-за которой я обращаюсь за помощью. Если вы можете помочь и вам нужна дополнительная информация, с удовольствием проясните и предоставьте дополнительную информацию, если я могу.


person knarf    schedule 19.01.2021    source источник
comment
Вам удалось это решить? Я столкнулся с той же проблемой.   -  person Guy Brooker    schedule 24.01.2021
comment
Вероятно, это связано с этим вопросом SO и это сообщение на форумах разработчиков приложений.   -  person gcharita    schedule 24.01.2021
comment
спасибо, @gcharita - я испытал то же самое. После прочтения этих ссылок я чувствую себя комфортно, зная, что другие также вручную редактируют файлы .swiftinterface.   -  person knarf    schedule 26.01.2021


Ответы (1)


Я вручную отредактировал файлы .swiftinterface, созданные в XCFramework, как для версии устройства, так и для версии симулятора. Я просто заменил все вхождения имени фреймворка из этих файлов. Таким образом, изменение SWXMLHash.XMLIndexerDeserializable - ›XMLIndexerDeserializable решило проблему для меня.

Также посмотрите последние комментарии к моему вопросу, это похоже на известную проблему. Просматривая некоторые из этих ссылок и проблем с ошибками, мое решение обычное, но не рекомендуемое. Рекомендуется не называть структуру так же, как классы внутри нее. В моей ситуации это зависимость пакета Swift, которую я импортировал, поэтому я не могу ее контролировать.

person knarf    schedule 26.01.2021