如何阻止Xcode为未指定的目标编译Swift Package?
问题描述
我正在构建一个包含自2008年开始iOS开发以来积累的大量类、扩展和模块的Swift Package。由于同时开发macOS、watchOS、iPadOS和tvOS,该Package包含适配各类Apple设备的代码,但此特定Package仅包含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"]) ] )
我将该Package导入到一个包含iOS和watchOS两个目标的项目中,仅打算在iOS目标中使用它的内容。但调试iOS目标时,Xcode仍尝试为watchOS目标编译该Package,导致大量错误。这迫使我在Package的每个文件中添加#if !os("watchOS")和#endif来隔离代码,但Package已声明platforms为[.iOS(.v16), .tvOS(.v13)]且仅添加给iOS目标,这种做法十分繁琐。请问有没有办法让Xcode正常工作,不为未指定的目标编译该Package?
解决方法
确认依赖的添加范围
确保MyPackage仅添加到iOS目标的依赖中,而非项目全局依赖:- 在Xcode中选中项目根节点,切换到右侧的「Targets」列表
- 选择你的iOS目标,进入「Dependencies」标签页,确认
MyPackage在此列表内 - 切换到watchOS目标的「Dependencies」标签页,确保该列表中没有
MyPackage
给Package的Target添加平台约束
在Package.swift中,为具体的target单独指定支持的平台,强化平台限制:targets: [ .target( name: "MyPackage", platforms: [.iOS(.v16), .tvOS(.v13)] ), .testTarget( name: "MyPackageTests", dependencies: ["MyPackage"], platforms: [.iOS(.v16), .tvOS(.v13)] ) ]清理Xcode缓存
缓存异常可能导致编译逻辑混乱,执行以下操作重置:- 关闭Xcode
- 删除DerivedData目录(可通过
Xcode > Settings > Locations找到DerivedData的路径) - 重新打开项目并执行Build操作
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

