You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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目标的依赖中,而非项目全局依赖:

    1. 在Xcode中选中项目根节点,切换到右侧的「Targets」列表
    2. 选择你的iOS目标,进入「Dependencies」标签页,确认MyPackage在此列表内
    3. 切换到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缓存
    缓存异常可能导致编译逻辑混乱,执行以下操作重置:

    1. 关闭Xcode
    2. 删除DerivedData目录(可通过Xcode > Settings > Locations找到DerivedData的路径)
    3. 重新打开项目并执行Build操作

内容的提问来源于stack exchange,提问作者Duck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:07:25