1

在 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”的位置之外,这两个清单文件之间是否存在显着差异?

4

1 回答 1

2

来自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. 
...

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

您的库所依赖的依赖项在

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

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

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

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

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

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

于 2022-02-03T06:56:42.370 回答