swiftlang/swift-package-manager

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

Open

#10,122 opened on 2026年5月26日

GitHub で見る
 (0 comments) (4 reactions) (0 assignees)Swift (1,462 forks)batch import
buggood first issue

Repository metrics

Stars
 (10,145 stars)
PR merge metrics
 (平均マージ 8d 1h) (30d で 76 merged PRs)

説明

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

コントリビューターガイド