如何通过构建配置从 Swift Package Manager 添加包? (解决方法)

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

是否有任何解决方法可以像在 Cocoapods 中一样从 Swift 包管理器添加包:

pod 'PonyDebugger', :configurations => ['Debug', 'Beta']
pod 'PonyDebugger', :configuration => 'Debug'

我知道有一个建议的解决方案(https://github.com/apple/swift-evolution/blob/main/proposals/0273-swiftpm-conditional-target-dependency.md#proposed-solution),但它是未完全实施且无法使用。

我的场景:我有两个版本的相同框架,其中一个应该用于开发,另一个应该用于发布。我可以做什么来根据我的构建配置区分它们?独特的解决方案是使用不同的目标吗?

ios xcode swift-package-manager
1个回答
0
投票

截至我上次更新,Swift Package Manager (SPM) 不支持直接基于构建配置的条件依赖关系,类似于 CocoaPods 使用 :configurations 选项的方式。但是,您可以考虑一些解决方法来实现类似的效果:

1。使用条件编译: 您可以根据编译器标志或构建设置有条件地包含包。例如,您可以为调试版本定义编译器标志,并使用它有条件地导入包。但是,这种方法需要修改您的代码,如果您想将包依赖项与代码库分开,这种方法可能并不理想。

#if DEBUG
import PackageA
#else
import PackageB
#endif

2。使用不同的目标: 一种常见的解决方法是在项目中创建多个目标,每个目标都有自己的一组在 Package.swift 文件中指定的依赖项。然后,您可以根据您的构建配置有条件地构建和运行不同的目标。

let package = Package(
    name: "MyProject",
    targets: [
        .target(
            name: "MyTarget",
            dependencies: [
                .product(name: "PackageA", package: "MyPackage"),
            ]
        ),
        .testTarget(
            name: "MyTargetTests",
            dependencies: ["MyTarget"]),
    ]
)

您可以在 Xcode 中为不同的构建配置创建单独的方案,每个方案构建不同的目标。

3.使用脚本阶段: 您可以在 Xcode 中创建自定义构建脚本阶段,以便在构建过程中有条件地从项目中添加或删除包。这种方法需要一些脚本知识,并且设置和维护可能更复杂。

if [ "$CONFIGURATION" == "Debug" ]; then
    swift package resolve
else
    swift package resolve --version x.y.z
fi

每种方法在复杂性、可维护性和灵活性方面都有自己的权衡。您需要选择最适合您的项目要求和限制的一种。

© www.soinside.com 2019 - 2024. All rights reserved.