如何让Swift Package Manager包实现Firebase式可选导入?
实现SPM包子库默认可选且不自动添加到目标的配置方案
要实现Firebase那种用户添加包时所有子库默认可选、Xcode「添加到目标」默认设为「无」的效果,核心是不让主包生成默认聚合产物,只保留独立的子库产物,具体调整如下:
关键配置修改逻辑
- 移除自动生成的聚合主产物:SwiftPM默认会创建一个与包同名的聚合库,包含所有目标,这会导致Xcode默认勾选所有内容。确保
products数组里只定义独立子库产物,完全不包含与包同名的聚合库。 - 保持子库产物独立性:每个子库作为单独的
library产物存在,不互相依赖,确保用户可以自主选择导入。
修改后的Package.swift代码
// swift-tools-version: 5.9 import PackageDescription let package = Package( name: "MyPackages", platforms: [.iOS(.v13)], products: [ // 仅声明独立子库产物,不创建聚合主产物 .library( name: "MyPackageA", targets: ["MyPackageA"], type: .dynamic // 可选,动态库更适配子库独立使用场景 ), .library( name: "MyPackageB", targets: ["MyPackageB"], type: .dynamic ) ], dependencies: [], targets: [ .target( name: "MyPackageA", dependencies: ["MyCorePackageBinary", "MyPackageABinary"], path: "MyPackageAPath" ), .target( name: "MyPackageB", dependencies: ["MyCorePackageBinary", "MyPackageBBinary"], path: "MyPackageBPath" ), .binaryTarget( name: "MyCorePackageBinary", path: "MyPath/MyCorePackageBinary.xcframework" ), .binaryTarget( name: "MyPackageABinary", path: "MyPathA/MyPackageABinary.xcframework" ), .binaryTarget( name: "MyPackageBBinary", path: "MyPathB/MyPackageBBinary.xcframework" ) ] )
效果验证说明
修改后在Xcode中添加包依赖时,会看到MyPackageA和MyPackageB作为两个独立可选项,每个选项的「添加到目标」默认值都是「无」,用户可自主选择需要导入的子库,并手动关联到指定项目目标。同时子库依赖的二进制包会随子库选择自动导入,不影响可选性。
内容的提问来源于stack exchange,提问作者SBouchard
相关产品推荐
相关产品推荐

