Swift Package Manager(SPM)描述文件主要是 Package.swift
,它定义了 Swift 包的配置和依赖。这个文件使用 Swift 语言编写,主要字段包括:
name
- 类型:
String
- 描述: 包的名称。
platforms
- 类型:
[SupportedPlatform]
- 描述: 声明包支持的平台及其最低版本。
products
- 类型:
[Product]
- 描述: 包产出的产品,主要是库或可执行文件。
dependencies
- 类型:
[Package.Dependency]
- 描述: 声明包的依赖项。
targets
- 类型:
[Target]
- 描述: 包包含的模块或测试模块。
swiftLanguageVersions
- 类型:
[SwiftVersion]
- 描述: 包支持的 Swift 语言版本。
cLanguageStandard
, cxxLanguageStandard
- 类型:
String
- 描述: 包使用的 C 和 C++ 语言标准。
字段详细说明:
platforms
用于声明支持的平台及其最低版本。示例:
.platforms: [
.macOS(.v10_15),
.iOS(.v13),
.tvOS(.v13),
.watchOS(.v6)
]
products
定义包产生的产品。示例:
.products: [
.library(name: "MyLibrary", targets: ["MyLibrary"]),
.executable(name: "MyExecutable", targets: ["MyExecutable"])
]
dependencies
声明包依赖的其他包。示例:
.dependencies: [
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0")
]
targets
定义包内的模块。示例:
.targets: [
.target(name: "MyLibrary", dependencies: []),
.testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"])
]
swiftLanguageVersions
声明支持的 Swift 版本。示例:
.swiftLanguageVersions: [.v5]
完整示例:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "MyPackage",
platforms: [
.macOS(.v10_15),
.iOS(.v13)
],
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]),
.executable(
name: "MyExecutable",
targets: ["MyExecutable"]),
],
dependencies: [
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
],
targets: [
.target(
name: "MyLibrary",
dependencies: []),
.target(
name: "MyExecutable",
dependencies: [
.product(name: "ArgumentParser", package: "swift-argument-parser"),
]),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]),
],
swiftLanguageVersions: [.v5]
)
这涵盖了 Swift Package Manager 描述文件的主要字段和用法。
App 的依赖和一个模块的描述,他们的 Package.swift 有什么区别?
在使用 Swift Package Manager 编写 Package.swift
文件时,针对应用(App)的依赖和模块(Library/Framework)的描述存在一些关键区别。这些区别主要体现在文件结构、产品类型和依赖项的声明上。
App 的 Package.swift
应用程序的 Package.swift
文件通常用于描述整个应用及其所有依赖项。它会指定应用的可执行产品(Executable)和相关的依赖包。示例:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "MyApp",
platforms: [
.macOS(.v10_15),
.iOS(.v13)
],
products: [
.executable(
name: "MyAppExecutable",
targets: ["MyApp"]),
],
dependencies: [
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0"),
.package(url: "https://github.com/Alamofire/Alamofire", from: "5.2.0"),
],
targets: [
.target(
name: "MyApp",
dependencies: [
.product(name: "ArgumentParser", package: "swift-argument-parser"),
"Alamofire"
]),
],
swiftLanguageVersions: [.v5]
)
主要区别:
- 产品类型:
products
定义了一个可执行产品(Executable),这是一个应用程序的二进制输出。
- 依赖项:
dependencies
列表包含了应用所需的所有外部包。依赖项声明在顶层。
- 目标(Targets):
targets
定义了一个主目标,该目标依赖于其他包,并包含应用的主要代码。
模块(Library)的 Package.swift
模块(库/框架)的 Package.swift
文件通常用于描述库的配置及其依赖项。它会指定库产品(Library)和相关的依赖包。示例:
// swift-tools-version:5.3
import PackageDescription
let package = Package(
name: "MyLibrary",
platforms: [
.macOS(.v10_15),
.iOS(.v13)
],
products: [
.library(
name: "MyLibrary",
targets: ["MyLibrary"]),
],
dependencies: [
.package(url: "https://github.com/AnotherLibrary/AnotherLibrary", from: "1.0.0"),
],
targets: [
.target(
name: "MyLibrary",
dependencies: ["AnotherLibrary"]),
.testTarget(
name: "MyLibraryTests",
dependencies: ["MyLibrary"]),
],
swiftLanguageVersions: [.v5]
)
主要区别:
- 产品类型:
products
定义了一个库产品(Library),这是一个模块的二进制输出,供其他代码使用。
- 依赖项:
dependencies
列表包含了模块所需的所有外部包。依赖项声明在顶层。
- 目标(Targets):
targets
定义了多个目标,包括库的主目标和测试目标。测试目标依赖于库的主目标。
总结
- App 的
Package.swift
文件重点在于描述整个应用及其所有依赖项,主要输出为可执行文件。 - 模块(Library) 的
Package.swift
文件重点在于描述模块的配置及其依赖项,主要输出为库文件,并可能包含测试目标。
这两种描述文件在结构和内容上有一些相似之处,但它们的目标和用途有所不同。