swiftlang/swift-package-manager
Auf GitHub ansehen`swift package add-target-dependency` adds incorrectly and create malformed Package.swift
Open
#10.122 geöffnet am 26. Mai 2026
buggood first issue
Repository-Metriken
- Stars
- (10.145 Stars)
- PR-Merge-Metriken
- (Durchschn. Merge 8T 1h) (76 gemergte PRs in 30 T)
Beschreibung
Is it reproducible with SwiftPM command-line tools: swift build, swift test, swift package etc?
- Confirmed reproduction steps with SwiftPM CLI. The description text must include reproduction steps with either of command-line SwiftPM commands,
swift build,swift test,swift packageetc.
Description
When using swift package add-target-dependency to add a target dependency to a target that is also a target dependency of another target, it adds the dependency in the incorrect place.
Expected behavior
Running swift package add-target-dependency TargetThree TargetOne using the below manifest should produce this:
// swift-tools-version: 6.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyPackage",
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyPackage",
targets: ["MyPackage"]
),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.target(
name: "MyPackage",
dependencies: [
.target(name: "TargetOne"),
.target(name: "TargetTwo"),
]
),
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage"]
),
- .target(name: "TargetOne"),
+ .target(name: "TargetOne", dependencies: [.target(name: "TargetThree"),]),
.target(name: "TargetTwo"),
.target(name: "TargetThree"),
],
swiftLanguageModes: [.v6]
)
Actual behavior
Instead, running swift package add-target-dependency TargetThree TargetOne produces this:
// swift-tools-version: 6.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyPackage",
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyPackage",
targets: ["MyPackage"]
),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.target(
name: "MyPackage",
dependencies: [
- .target(name: "TargetOne"),
+ .target(name: "TargetOne",dependencies: [
+ .target(name: "TargetThree"),]),
.target(name: "TargetTwo"),
]
),
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage"]
),
.target(name: "TargetOne"),
.target(name: "TargetTwo"),
.target(name: "TargetThree"),
],
swiftLanguageModes: [.v6]
)
Steps to reproduce
mkdir MyPackage && cd MyPackageswift package init --type library --name MyPackageswift package add-target TargetOne && swift package add-target TargetTwo && swift package add-target TargetThreeswift package add-target-dependency TargetOne MyPackageswift package add-target-dependency TargetTwo MyPackage
At this point the plugin's manifest should look like this:
// swift-tools-version: 6.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyPackage",
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyPackage",
targets: ["MyPackage"]
),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.target(
name: "MyPackage",
dependencies: [
.target(name: "TargetOne"),
.target(name: "TargetTwo"),
]
),
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage"]
),
.target(name: "TargetOne"),
.target(name: "TargetTwo"),
.target(name: "TargetThree"),
],
swiftLanguageModes: [.v6]
)
swift package add-target-dependency TargetThree TargetOne
This creates a malformed manifest:
// swift-tools-version: 6.3
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyPackage",
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyPackage",
targets: ["MyPackage"]
),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.target(
name: "MyPackage",
dependencies: [
.target(name: "TargetOne",dependencies: [
.target(name: "TargetThree"),]),
.target(name: "TargetTwo"),
]
),
.testTarget(
name: "MyPackageTests",
dependencies: ["MyPackage"]
),
.target(name: "TargetOne"),
.target(name: "TargetTwo"),
.target(name: "TargetThree"),
],
swiftLanguageModes: [.v6]
)
- If you run
swift package dump-package, you'll get an error like this:
error: 'mypackage': Invalid manifest (compiled with: ...)
.../MyPackage/Package.swift:21:57: error: extra argument 'dependencies' in call
19 | name: "MyPackage",
20 | dependencies: [
21 | .target(name: "TargetOne",dependencies: [
| `- error: extra argument 'dependencies' in call
22 | .target(name: "TargetThree"),]),
23 | .target(name: "TargetTwo"),
.../MyPackage/Package.swift:22:6: error: type 'Any' has no member 'target'
20 | dependencies: [
21 | .target(name: "TargetOne",dependencies: [
22 | .target(name: "TargetThree"),]),
| `- error: type 'Any' has no member 'target'
23 | .target(name: "TargetTwo"),
24 | ]
error: invalid manifests at [<AbsolutePath:".../MyPackage">]
Swift Package Manager version/commit hash
6.3.2
Swift & OS version (output of swift --version ; uname -a)
swift-driver version: 1.148.6 Apple Swift version 6.3.2 (swiftlang-6.3.2.1.108 clang-2100.1.1.101)
Target: arm64-apple-macosx26.0
Darwin xxx 25.4.0 Darwin Kernel Version 25.4.0: Thu Mar 19 19:31:17 PDT 2026; root:xnu-12377.101.15~1/RELEASE_ARM64_T6020 arm64