Swift包管理器 - UIKit 依赖

67

我在项目中有一个 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?


你必须使用 xcodebuild 替代。 - Ilias Karim
7个回答

53

你需要更改一些swiftc选项,以便针对适当的sdk和目标构建项目

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

8
这应该是被接受的答案!我可以证实,以下方法在使用iOS 14时也有效:swift build -Xswiftc "-sdk" -Xswiftc "\xcrun --sdk iphonesimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios14.0-simulator"` - blackjacx
对于tvOS:swift build -Xswiftc "-sdk" -Xswiftc "\xcrun --sdk appletvsimulator --show-sdk-path`" -Xswiftc "-target" -Xswiftc "x86_64-apple-tvos14.3-simulator"` - Anton Plebanovich
这对我有用,但是Xcode无法识别项目内的二进制文件,我想使用在Package.swift中指定的库依赖项。我觉得我可能错过了一个明显的步骤...? - user3773048
2
我正在尝试为watchOSmacCatalyst构建。我已经弄清楚可以使用watchsimulatormacosx代替iphonesimulator,但我无法找到可用的-target值列表。你是如何找到x86_64-apple-ios13.0-simulator的? - AdamPro13
1
更新:仍然适用于Xcode 14.2和iOS 16.2:swift build -Xswiftc“-sdk”-Xswiftc“xcrun --sdk iphonesimulator --show-sdk-path”-Xswiftc“-target”-Xswiftc“arm64-apple-ios16.2-simulator” - Legonaftik
这在iOS 17上会出问题。这是我的命令:swift build -Xswiftc "-sdk" -Xswiftc "xcrun --sdk iphonesimulator --show-sdk-path" -Xswiftc "-target" -Xswiftc "arm64-apple-ios17.0-simulator" - undefined

38

无需限制平台,使其可用:

您应该选择 iOS-based target 以使其可用:

演示

如果默认选择了 macOS,则会出现错误。


限制为特定平台

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

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

支持多平台

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

#if canImport(UIKit)

import UIKit

#endif

6
那就是答案! - mgyky
1
我笑喷了,我竟然花了一个小时的时间尝试在macOS上进行构建...真是可笑。 - Rob
1
实际上,您无法限制软件包编译的平台,但可以指定最低版本。因此,拥有“platforms:[.iOS(.v10)]”意味着所有macOS、tvOS等以及iOS 10及以上版本。 - Stoyan
1
“限制在特定平台上”似乎不起作用(当前最新版本:Xcode 14.2,Swift 5.7.2)。在Xcode中打开包时,仍会显示“我的Mac”和“任何Mac”设备,并且使用swift build从命令行构建时,它仍会假定macOS并将失败,出现“error: no such module 'UIKit'”等错误。 - Slipp D. Thompson

26

目前,Swift Package Manager已经完全支持Xcode。我能够通过在我的Package.swift清单中指定平台为iOS来解决这个错误。

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

然后您可以在Xcode中打开Package.swift文件,它会正常工作。


16
我遇到了最初的问题,即使定义了平台也是如此。 - spentag
不幸的是,我不得不为我的内部框架使用git子模块。 :( - spentag
24
定义平台后,在构建时确保顶部选择了 iPhone 模拟器。注意不改变原意,使翻译通俗易懂。 - edbentley
你如何在Xcode中打开Package.swift文件?当我尝试在Xcode中打开该文件时,它并没有起作用。这个文件需要添加到项目中吗? - user3773048

13

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

随着Swift Package Manager的发展,可能会使iOS、tvOS等变得可访问。

2015年12月4日下午5:39,Daniel Dunbar (@apple.com)写道:

...

没错,现在我们只为主机平台(目前为OS X或Linux)编译。除其他外,我们目前没有任何关于您正在定位的SDK或架构的知识(或选择选项)。我们也没有在清单中指定目标与哪些平台兼容的机制。


你能指出Swift Package Manager仅适用于MacOS和Linux的文档吗? - Onato
即使您可以构建iOS可执行文件,您如何将其放入并在iOS设备上运行呢?swift build --help没有架构选项。https://swift.org/package-manager/#conceptual-overview的文档仅提到了Darwin和Linux。 - GoZoner
4
Swift Package Manager 不仅适用于 OS X 和 Linux,这些只是它当前支持的平台。计划支持其他平台。 - Rick Ballard
很好!谢谢你。 - GoZoner
显示剩余3条评论

7

enter image description here

请确保您选择的模拟器目标是 iPhone。Mac 目标是默认选项,但无法正常工作...如果 Xcode 能够查看清单并根据其选择默认模拟器,那就太棒了...


2

使用条件编译块:

#if canImport(UIKit)

// Code specific to platforms where UIKit is available

#endif

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

本文介绍如何使用Xcode创建Swift Package。Swift Package是一种用于打包、共享和重用代码的标准化格式。通过使用Swift Package,您可以将代码打包为模块,并将其作为依赖项添加到其他项目中。


2
OP需要解决Swift构建错误的问题,而不是条件导入。 - Skwiggs

-2

SPM 错误

no such module 'UIKit'

当我使用包含 umbrella header(<module_name.h>)[关于] 时,我遇到了这个问题

#import <UIKit/UIKit.h>

这意味着您可以跳过在每个文件中指定import UIKit。但似乎SPM不支持它。此外,我不支持使用@_exported属性。

您可以使用下一种方法

#if canImport(UIKit)

import UIKit

#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接