我正在构建一个包,其中包含自 2008 年开始开发 iOS 以来我一直在构建的许多类、扩展和模块。
由于我还针对 macOS、watchOS、iPadOS 和 tvOS 进行开发,因此该软件包包含适用于每种风格或 Apple 设备的代码。
特别是在这个包中,我有适用于 iOS 和 tvOS 的东西。
该包声明如下:
import PackageDescription
let package = Package(
name: "MyPackage",
platforms: [.iOS(.v16), .tvOS(.v13)],
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyPackage",
targets: ["MyPackage"]),
],
targets: [
.target(name: "MyPackage"),
.testTarget(name: "MyPackageTests", dependencies: ["MyPackage"])
]
)
我已将此包导入到一个具有两个目标的项目中,一个用于 iOS,另一个用于 watchOS,因为我想在 iOS 目标中使用它包含的用于 iOS 的内容。
我现在正在调试 iOS 目标。即便如此,Xcode 也会给出很多错误,因为它正在尝试针对 watchOS 目标编译包。
这迫使我在每个文件中添加#if !os("watchOS)
包#endif
必须隔离代码并防止 Xcode 为 watchOS 目标编译它。这是非常愚蠢的,因为包是这样声明的:
platforms: [.iOS(.v16), .tvOS(.v13)],
因为该包刚刚为 iOS 目标添加。
有没有办法让 Xcode 按预期工作,而不是为未声明的目标编译包?
未能包含平台意味着该软件包支持该平台的默认版本:
SPM中没有办法表达“不支持Apple平台”。您可以用 表示“不适用于某个平台”
@available
,但代码仍然需要编译,这通常意味着添加#if
测试。请注意,这
#if !os(watchOS)
意味着它确实可以针对visionOS 进行编译。每当新平台出现时,所有软件包都会自动支持它。