Swift Package Manifest - 库目标和目标依赖项之间有什么区别?

Nob*_*adi 6 dependencies swift swift-package-manager swift-package

在 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: []),
    ]
)
Run Code Online (Sandbox Code Playgroud)

在下一个示例中,“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: []),
        ]
    )
Run Code Online (Sandbox Code Playgroud)

据我所知,这两个选项都会产生相同的结果:当我将 MySwiftPackage 声明为 Xcode 项目内的依赖项时,我可以导入“MySwiftPackage”模块和“Helper”模块。

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

nSq*_*uid 7

来自Swift 包管理器文档

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. 
...
Run Code Online (Sandbox Code Playgroud)

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

您的库所依赖的依赖项定义在

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. 
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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