swiftlang/swift-package-manager

`swift package add-target-dependency` adds incorrectly and create malformed Package.swift

Open

#10.122 aberto em 26 de mai. de 2026

Ver no GitHub
 (0 comments) (4 reactions) (0 assignees)Swift (1.462 forks)batch import
buggood first issue

Métricas do repositório

Stars
 (10.145 stars)
Métricas de merge de PR
 (Mesclagem média 8d 1h) (76 fundiu PRs em 30d)

Description

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 package etc.

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

  1. mkdir MyPackage && cd MyPackage
  2. swift package init --type library --name MyPackage
  3. swift package add-target TargetOne && swift package add-target TargetTwo && swift package add-target TargetThree
  4. swift package add-target-dependency TargetOne MyPackage
  5. swift 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]
)
  1. 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]
)
  1. 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

Guia do colaborador