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 可以查看清单并根据它选择默认模拟器,那就太棒了...
我的项目中有一个 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 可以查看清单并根据它选择默认模拟器,那就太棒了...