You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Swift Package Manager包实现Firebase式可选导入?

实现SPM包子库默认可选且不自动添加到目标的配置方案

要实现Firebase那种用户添加包时所有子库默认可选、Xcode「添加到目标」默认设为「无」的效果,核心是不让主包生成默认聚合产物,只保留独立的子库产物,具体调整如下:

关键配置修改逻辑

  1. 移除自动生成的聚合主产物:SwiftPM默认会创建一个与包同名的聚合库,包含所有目标,这会导致Xcode默认勾选所有内容。确保products数组里只定义独立子库产物,完全不包含与包同名的聚合库。
  2. 保持子库产物独立性:每个子库作为单独的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:16:10