Swift 包清单 - 库目标和目标依赖项之间有什么区别?

Swift Package Manifest - What is the difference between library targets and target dependencies?

在 Package.swift 中,将目标添加到库中的目标数组与将目标添加到依赖项数组之间有什么区别。

在第一个示例中,'Helpers' 作为依赖项添加到 'MySwiftPackage' 目标。

let package = Package(
    name: "MyTestPackage",
    products: [
        .library(
            name: "MyTestPackage",
            targets: ["MyTestPackage"]),
        .library(
            name: "Helper",
            targets: ["Helper"]),
    ],
    dependencies: [
    ],
    targets: [
        .target(
            name: "MyTestPackage",
            dependencies: ["Helper"]), // <---- 'Helper' defined as dependency
        .target(
            name: "Helper",
            dependencies: []),
    ]
)

在下一个示例中,'Helper' 作为另一个目标添加到 'MySwiftPackage' 库中。

let package = Package(
        name: "MyTestPackage",
        products: [
            .library(
                name: "MyTestPackage",
                targets: ["MyTestPackage","Helper",]), // <-- 'Helper' defined in targets
            .library(
                name: "Helper",
                targets: ["Helper"]),
        ],
        dependencies: [
        ],
        targets: [
            .target(
                name: "MyTestPackage",
                dependencies: []),
            .target(
                name: "Helper",
                dependencies: []),
        ]
    )

据我所知,这两个选项产生相同的结果:当我将 MySwiftPackage 声明为 Xcode 项目中的依赖项时,我能够导入 'MySwiftPackage' 模块和'Helper' 模块。

除了放置 'Helper' 的位置之外,这两个清单文件之间是否存在显着差异?

来自Swift Package Manager Documentation

A target may build either a library or an executable as its product.
A library contains a module that can be imported by other Swift code. 
...

库是可以由其他 swift 代码导入的东西。

您的库所依赖的依赖项在

中定义
.target(name: "MyTestPackage", dependencies: ["Helper"])

目标可以被认为是在文件夹中组织的模块。

当您定义 MyTestPackage 时,您在包的目标数组中声明其依赖项 Helper。如果您没有在那里声明它,MyTestPackage 中的代码将无法导入 Helpers。

在第一个示例中,库 MyTestPackage 的目标包含辅助程序作为 MyTestPackage 的依赖项,因此您可以删除 Helper 库并且应该仍然能够导入您项目中的 MyTestPackage 和 Helper。

在第二个示例中,您将 MyTestPackageHelpers 都声明为构成 MyTestPackage 库的目标,因此您应该能够再次删除 Helper 库并仍然从两个模块导入代码。

如果您要从任一示例中删除这两个库,您将无法将任何代码导入到您的项目中