Swift 包管理器 - UIKit 依赖

Swift Package Manager - UIKit Dependency

我的项目中有一个 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
       ^

我应该在哪里告诉 swift 包管理器在哪里可以找到 UIKit?

Swift 包管理器在 OS X(或 Linux)上将可执行文件构建为 运行; UIKit 是 iOS 中的一个框架,将无法访问。

它可能 iOS、tvOS 和其他随着 Swift 包管理器的发展而变得可用。

On Dec 4, 2015, at 5:39 PM, Daniel Dunbar (@apple.com) wrote:

...

是的,现在我们只为主机平台编译(OS X 或 Linux,当前)。除其他外,我们目前不知道(或选择的选项)您的目标是什么 SDK 或架构。我们也没有在清单中指定与哪些平台目标兼容的机制。

目前 Swift 包管理器具有完整的 Xcode 支持。通过在我的 Package.swift 清单中指定平台是 iOS.

,我能够绕过这个错误
let package = Package(
    name: "MyPackage",
    platforms: [
        .iOS(.v8)
    ],

然后你可以打开 Xcode 中的 Package.swift 文件就可以了。

您必须更改一些 swiftc 选项才能根据正确的 sdk 和目标构建项目

swift build -Xswiftc "-sdk" -Xswiftc "`xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios13.0-simulator"

使用条件编译块:

#if canImport(UIKit)

// Code specific to platforms where UIKit is available

#endif

来源:https://developer.apple.com/documentation/xcode/creating_a_swift_package_with_xcode

使其不受平台限制地工作:

您应该select一个基于iOS的目标使其可用:

如果在 macOS(默认情况下)中保留 select,您将收到错误消息。


仅限特定平台

如果您希望您的包仅适用于特定平台(例如仅适用于 iOS),您应该在 package.swift 文件中指定平台:

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

支持多平台

如果您需要您的框架在多个平台上可用,请不要忘记检查导入框架的可用性,例如:

#if canImport(UIKit)

import UIKit

#endif

如果您的umbrella header(<module_name.h>)包含

#import <UIKit/UIKit.h>

这意味着您可以跳过在每个文件中指定 import UIKit。不过好像SPM不支持。我也不支持使用 @_exported 属性

你可以明确地写import UIKit

确保您 select 一个 iPhone 作为模拟器目标。 Mac 目标是默认目标,它不会工作...如果 Xcode 可以查看清单并根据它选择默认模拟器,那就太棒了...