是否有任何解决方法可以像在 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),但它是未完全实施且无法使用。
我的场景:我有两个版本的相同框架,其中一个应该用于开发,另一个应该用于发布。我可以做什么来根据我的构建配置区分它们?独特的解决方案是使用不同的目标吗?
截至我上次更新,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
每种方法在复杂性、可维护性和灵活性方面都有自己的权衡。您需要选择最适合您的项目要求和限制的一种。