SPM Traits not working correctly with multiple targets in same Xcode workspace (App + App Clip)

Hi, I've just migrated to Swift Tools 6.2 and package traits, and I'm encountering an issue when using traits with multiple targets in the same Xcode workspace.

Setup:

  • Main iOS app target
  • App Clip target
  • Both consume the same local packages (e.g., UIComponents)

What I'm trying to achieve:

  • Main app imports packages without the COMPACT_BUILD trait
  • App Clip imports packages with the COMPACT_BUILD trait enabled

Package configuration (simplified):

// UIComponents/Package.swift
let package = Package(
    name: "UIComponents",
    platforms: [.iOS(.v18)],
    traits: [
        .trait(name: "COMPACT_BUILD", description: "Minimal build for App Clips"),
    ],
    // ...
    targets: [
        .target(
            name: "UIComponents",
            dependencies: [...],
            swiftSettings: [
                .define("COMPACT_BUILD", .when(traits: ["COMPACT_BUILD"])),
            ]
        ),
    ]
)

In the code:

#if COMPACT_BUILD
// Excluded from App Clip
#endif

The consumer packages:

Main app's package imports without trait:

.package(path: "../UIComponents")

App Clip's package imports with trait:

.package(path: "../UIComponents", traits: ["COMPACT_BUILD"])

The problem: When building the main app target, the COMPACT_BUILD compiler condition is unexpectedly active — even though the main app's dependency chain never enables that trait. It seems like the trait enabled by the App Clip target is "leaking" into the main app build.

I confirmed this by adding #error("COMPACT_BUILD is active") — it triggers when building the main app, which shouldn't happen.

If I disable the App Clip target from the build scheme, the main app builds correctly with COMPACT_BUILD not defined.

I am also able to build the App Clip separately.

Environment:

  • Xcode 26.2
  • swift-tools-version: 6.2
  • iOS 26.2

Questions:

  1. Is this expected behavior with Xcode's SPM integration? Are traits resolved workspace-wide rather than per-target?
  2. Is there a workaround to have different trait configurations for different targets consuming the same package?
  3. Or do I need to fall back to separate package targets (e.g., UIComponents and UIComponentsCompact) to achieve this?

Any guidance would be appreciated. Thanks!

SPM Traits not working correctly with multiple targets in same Xcode workspace (App + App Clip)
 
 
Q