Swift Package如何为Target配置基于平台的条件依赖?
解决Swift包基于目标平台的条件依赖问题
你的判断没错,Package.swift中的#if os()是对构建环境的判断(比如你在macOS电脑上构建,不管目标是iOS还是macOS,都会走else分支),而非目标平台。要实现基于目标平台的条件依赖,应该用SwiftPM提供的condition: .when(platforms:)参数来配置。
方案一:直接在Target依赖中指定平台条件(推荐)
修改客户端包的Package.swift,在MyLib的依赖中为不同平台添加对应的产物,并通过condition参数限定生效平台:
// swift-tools-version:5.6 import PackageDescription let package = Package( name: "MyLib", products: [ .library(name: "MyLib", targets: ["MyLib"]), ], dependencies: [ .package(url: "https://github.com/spencerkohan/LibFoo", branch:"master") ], targets: [ .target( name: "MyLib", dependencies: [ // 仅当目标平台为iOS时,依赖LibFooFramework .product(name: "LibFooFramework", package: "LibFoo", condition: .when(platforms: [.iOS])), // 仅当目标平台为macOS时,依赖ClibFoo .product(name: "ClibFoo", package: "LibFoo", condition: .when(platforms: [.macOS])) ] ) ] )
方案二:为依赖包的Target添加平台限制(可选,增强严谨性)
为了避免在错误平台上引用不兼容的Target,可以在LibFoo的Package.swift中给每个Target添加平台限制:
// swift-tools-version:5.6 import PackageDescription let package = Package( name: "LibFoo", products: [ .library(name: "LibFooFramework", targets: ["LibFooFramework"]), .library(name: "ClibFoo", targets: ["ClibFoo"]) ], targets: [ .binaryTarget( name: "LibFooFramework", path: "path/to/LibFooFramework.xcframework", // 限定该Target仅支持iOS平台,可根据实际需求调整最低版本 platforms: [.iOS(.v13)] ), .systemLibrary( name: "ClibFoo", pkgConfig: "libFoo", // 限定该Target仅支持macOS平台,可根据实际需求调整最低版本 platforms: [.macOS(.v10_15)] ) ] )
关键说明
condition: .when(platforms:)是SwiftPM专门针对目标平台设计的条件依赖配置,会根据你要构建的目标(iOS/macOS)自动选择对应的依赖。- 确保
LibFooFramework.xcframework包含iOS所需的架构,ClibFoo对应的系统库在macOS环境中能通过pkgConfig正常找到。
内容的提问来源于stack exchange,提问作者sak
相关产品推荐
相关产品推荐

