@alexmx this is a documented limitation of Tuist’s XcodeProj-based integration: SPM build tool plugins are not supported through the Tuist/Package.swift + .external(name:) path [1].
Build tool plugins have no equivalent native Xcode project primitive. To support them, Tuist would need to evaluate the plugin’s Swift code, reproduce SwiftPM’s plugin context, discover commands, model declared inputs/outputs, and add generated files to the target graph — none of which it can do today [1]. This is also why there’s a related open issue (#11453) tracking crashes when external packages transitively depend on build-tool-plugin products.
The documented workaround is to declare the package using Xcode’s default integration in your project manifest’s packages array and attach the plugin with .package(product:type: .plugin):
let project = Project(
name: "App",
packages: [
.remote(url: "https://github.com/aws-amplify/aws-sdk-swift", requirement: .exact("1.7.53")),
],
targets: [
.target(
name: "App",
dependencies: [
.package(product: "AWSCognitoIdentity", type: .runtime),
]
),
]
)
The tradeoff is that Xcode owns plugin resolution, so tuist cache won’t be able to cache those targets — binary caching only works with the XcodeProj-based integration [2].
Your practical options:
- Use Xcode’s default integration (
packagesarray) foraws-sdk-swift, accepting those targets won’t be cacheable. - Pin to
aws-sdk-swift≤ 1.6.7, which predates the plugin-based codegen (as you’ve confirmed works). - Run smithy codegen outside the Xcode build (e.g., as a pre-build script or CI step), check in the generated sources, and consume them as regular files — then XcodeProj integration and caching work normally.
You may also want to try installing this debugging skill following these steps and using a coding agent to investigate whether there’s a viable project-level workaround for your specific setup. For a longer discussion on workarounds or future support, the community forum would be a good place to continue.
To reply, just mention @dosu.
Share context across your team and agents. Try Dosu.