有条件地在 Swift Package Manager 构建中包含系统库 (FFmpeg)?

问题描述 投票:0回答:1

我正在开发一个 Swift 项目,并且想创建我的包的两个版本:

  • 没有外部C库(FFmpeg)的基本版本。
  • 以及包含对 FFmpeg 的可选依赖项的版本。

到目前为止,我拥有的是两个独立的

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
中。

我的问题是:

  1. 如何根据构建标志或任何其他方法有条件地在
    Package.swift
    中包含像 FFmpeg 这样的系统库?
  2. 使用多个 Package.swift 文件(一个带 FFmpeg,一个不带 FFmpeg)是一种合理的方法,还是有更正确的方法来处理 SwiftPM 中的可选依赖项?

我对 Swift 开发比较陌生,因此任何指导或替代方法将不胜感激!

swift swiftpm
1个回答
0
投票

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"])
            ]
        )
    ] : [])
)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.