我正在开发一个 Swift 项目,并且想创建我的包的两个版本:
到目前为止,我拥有的是两个独立的
Package.swift
文件:
...
targets: [
.executableTarget(
name: "macSubtitleOCR",
dependencies: [
.product(name: "ArgumentParser", package: "swift-argument-parser")
]),
...
和:
...
targets: [
.systemLibrary(
name: "CFFmpeg",
pkgConfig: "libavformat libavcodec libavutil",
providers: [
.brew(["ffmpeg"])
]),
.executableTarget(
name: "macSubtitleOCR",
dependencies: [
.product(name: "ArgumentParser", package: "swift-argument-parser"),
"CFFmpeg"
]),
...
我尝试添加像
#if FFMPEG
这样的编译标志,然后运行适用于源文件的swift build -Xswiftc -DFFMPEG
,但是编译标志不能正常工作,这是可以理解的,在Package.swift
中。
我的问题是:
Package.swift
中包含像 FFmpeg 这样的系统库?我对 Swift 开发比较陌生,因此任何指导或替代方法将不胜感激!
Swift Package Manager (SwiftPM) 不直接支持条件依赖项,但您可以使用环境变量管理可选依赖项。这种方法可以有条件地将依赖项包含在单个 Package.swift 文件中。
解决方案
定义环境变量并在 Package.swift 中使用条件逻辑,仅在需要时包含 CFFmpeg 目标:
import PackageDescription
let hasFFmpeg = ProcessInfo.processInfo.environment["USE_FFMPEG"] == "1"
let package = Package(
name: "macSubtitleOCR",
dependencies: [
.package(url: "https://github.com/apple/swift-argument-parser", from: "1.0.0")
],
targets: [
.executableTarget(
name: "macSubtitleOCR",
dependencies: [
.product(name: "ArgumentParser", package: "swift-argument-parser")
] + (hasFFmpeg ? ["CFFmpeg"] : [])
)
] + (hasFFmpeg ? [
.systemLibrary(
name: "CFFmpeg",
pkgConfig: "libavformat libavcodec libavutil",
providers: [
.brew(["ffmpeg"])
]
)
] : [])
)