Swift Package Manager - зависимость UIKit

В моем проекте есть Package.swift, например:

import PackageDescription

let package = Package(
    name: "ProjectName",
        dependencies: [
           .Package(url: "https://github.com/example/repo.git", majorVersion: 0)
        ]
 )

Когда я запускаю swift build, я получаю такие ошибки, как…

/project/Packages/WebViewController.swift:1:8: error: no such module 'UIKit'
import UIKit
       ^

Где я могу сказать быстрому пакетному менеджеру, где найти UIKit?


person Onato    schedule 13.01.2016    source источник


Ответы (6)


В настоящее время Swift Package Manager имеет полную поддержку Xcode. Мне удалось обойти эту ошибку, указав в моем манифесте Package.swift, что это платформа iOS.

let package = Package(
    name: "MyPackage",
    platforms: [
        .iOS(.v8)
    ],

Затем вы можете открыть файл Package.swift в Xcode, и он будет работать.

person Joe Susnick    schedule 10.10.2019
comment
У меня возникает исходная проблема, даже когда я определяю платформу. - person spentag; 28.04.2020
comment
К сожалению, нет - мне пришлось использовать подмодули git для моего внутреннего фреймворка. :( - person spentag; 12.06.2020
comment
После определения платформы убедитесь, что при сборке вверху выбран симулятор iPhone. - person edbentley; 15.06.2020

Вам нужно изменить некоторые параметры swiftc, чтобы построить проект на основе правильного sdk и target.

swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios13.0-simulator"
person AbdelAli    schedule 03.11.2019
comment
Это должен быть принятый ответ! Я могу подтвердить, что он работает с iOS 14, используя следующее: swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios14.0-simulator" - person blackjacx; 01.09.2020
comment
Для tvOS: swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk appletvsimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-tvos14.3-simulator" - person Anton Plebanovich; 07.04.2021

Swift Package Manager создает исполняемые файлы для работы в OS X (или Linux); UIKit - это фреймворк в iOS, и он не будет доступен.

Это может быть iOS, tvOS и другие, которые станут доступны по мере развития Swift Package Manager.

4 декабря 2015 г. в 17:39 Дэниел Данбар (@ apple.com) написал:

...

Хорошо, теперь мы компилируем только для хост-платформы (в настоящее время OS X или Linux). Помимо прочего, в настоящее время у нас нет информации (или возможности выбрать), на какой SDK или архитектуру вы нацеливаетесь. У нас также нет механизмов для указания, с какими платформами совместимы цели в манифесте.

person GoZoner    schedule 13.01.2016
comment
Можете ли вы указать на документацию, что Swift Package Manager предназначен только для MacOS и Linux? - person Onato; 14.01.2016
comment
Что ж, даже если бы вы могли создать исполняемый файл iOS, как бы вы вообще могли его запустить и запустить на устройстве iOS? swift build --help не показывает вариант архитектуры. В документации на swift.org/package-manager/#conceptual-overview упоминается только Дарвин и Linux. - person GoZoner; 14.01.2016
comment
Я ожидал, что он построит фреймворк, подобный Карфагену. - person Onato; 14.01.2016
comment
Swift Package Manager предназначен не только для OS X и Linux; это только текущие платформы, которые он поддерживает. Планируется поддержка других платформ. - person Rick Ballard; 19.02.2016
comment
Хороший! Спасибо за это. - person GoZoner; 19.02.2016
comment
В зависимости от модулей Apple: в настоящее время нет явной поддержки зависимости от UIKit, AppKit и т. д., хотя импорт этих модулей должен работать, если они присутствуют в надлежащем месте в системе. В будущем мы добавим явную поддержку системных зависимостей. Обратите внимание, что в настоящее время диспетчер пакетов не поддерживает платформы iOS, watchOS или tvOS. - person Winter; 09.03.2017
comment
Этот ответ сейчас кажется полностью устаревшим, поскольку поддерживает SPM macOS, iOS, tvOS, watchOS и Linux, скоро появятся Windows и Android, а также В macOS теперь есть UIKit. - person Ky Leggiero; 15.01.2020
comment
Это то, что происходит со временем. Нет? Там явно есть многочисленные даты. Стоит отрицательный голос? Действительно? - person GoZoner; 17.01.2020

Make it work without limit the platforms:

Вы должны выбрать цель для iOS, чтобы сделать ее доступной:

Демо

Если вы оставите его с выбором macOS (по умолчанию), вы получите сообщение об ошибке.


Limit to a specific platform

если вы хотите, чтобы ваш пакет был доступен только для определенных платформ (например, только для iOS), вы должны указать платформу в файле package.swift:

let package = Package(
    name: "MyLibrary",
    platforms: [
        .iOS(.v10)
    ],
    products: [
,,,

Support Multiplatform

Если вам нужно, чтобы ваш фреймворк был доступен на нескольких платформах, не забудьте проверить доступность импортированного фреймворка, например:

#if canImport(UIKit)

import UIKit

#endif
person Mojtaba Hosseini    schedule 17.02.2021

Используйте блоки условной компиляции:

#if canImport(UIKit)

// Code specific to platforms where UIKit is available

#endif

Источник: https://developer.apple.com/documentation/xcode/creating_a_swift_package_with_xcode

person Lachtan    schedule 31.12.2019
comment
OP нужно решение для быстрой ошибки сборки, а не условного импорта ... - person Skwiggs; 01.09.2020

Если ваш umbrella header(<module_name.h>) [About] содержит

#import <UIKit/UIKit.h>

это означает, что вы можете не указывать import UIKit в каждом файле. Но похоже, что SPM это не поддерживает. Также я не сторонник использования атрибута @_exported

Вы можете написать import UIKit явно

person yoAlex5    schedule 25.04.2021