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!