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

Swift Package Manager本地实用吗?代码复用相关技术咨询

用SPM在单Git仓库内实现功能分组复用,完美适配你的实验场景

嘿,你的需求完全可行!SPM根本不是什么“大材小用”,它特别适合这种轻量化的代码复用、功能分组场景。咱们先逐个解决你的疑问,再给你一套落地的方案:

你的核心疑问解答

1. 包目标的文件必须放在同一文件夹吗?当然不用!

SPM支持完全自定义的文件结构,你可以根据功能把文件分散在不同的目录里,只需要在Package.swift里通过path参数指定就行。比如你可以把API相关的文件放在Sources/API,便捷扩展放在Sources/Extensions,甚至还能细分到子文件夹,只要在target配置里写清楚路径。举个例子:

.target(
    name: "MyAPI",
    path: "Sources/API",
    sources: ["Networking", "Models"] // 还能指定子文件夹里的具体文件
)

这样你的文件结构能保持清晰,完全不会混乱。

2. 实验App用包必须存独立Git仓库吗?复制包和直接复制类有啥区别?

完全不需要独立仓库!你可以把包和实验App放在同一个Git仓库里,这种叫「本地包」。和手动复制类相比,优势太明显了:

  • 你只需要维护一套代码,不管在实验App还是其他项目里用,改一处所有地方都同步生效,不会出现复制版本不一致的问题。
  • SPM会帮你自动处理依赖管理、编译顺序这些琐事,比手动复制文件省心太多,还能避免重复代码堆积。

3. 所有地方都要导入包吗?会不会是额外负担?

是的,用包内的代码时确实需要导入对应的包名,但这其实是个好事——它明确了代码的来源和依赖关系,让项目结构更清晰。而且你不用把所有功能打包成一个大杂烩包,可以拆成多个小的、专注的包(比如MyAPI、MyExtensions),用到哪个就导入哪个,反而比代码混在一起更容易管理。比如用扩展的时候导入MyExtensions,用API的时候导入MyAPI,完全不会有冗余负担。

落地方案:单Git仓库内实现功能分组+跨项目复用

接下来教你怎么一步步实现,全程只维护一个Git仓库:

1. 整理现有代码

把你想复用的功能(比如API、便捷扩展)从现有项目里抽出来,放到项目根目录下的Sources文件夹里,按功能分成不同的子目录,比如:

你的项目根目录/
├─ Sources/
│  ├─ API/           # API相关代码
│  │  ├─ NetworkManager.swift
│  │  └─ Models/
│  └─ Extensions/    # 便捷扩展代码
│     ├─ UIKitExtensions.swift
│     └─ FoundationExtensions.swift
├─ 你的实验App/      # 原有的实验App目录
└─ Package.swift     # 接下来要创建的SPM配置文件

2. 创建Package.swift配置文件

在项目根目录下新建这个文件,定义你的包目标和产品。示例如下:

// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "MySharedTools",
    products: [
        // 定义对外暴露的库产品
        .library(name: "MyAPI", targets: ["MyAPI"]),
        .library(name: "MyExtensions", targets: ["MyExtensions"]),
    ],
    targets: [
        // 定义每个包的目标和路径
        .target(
            name: "MyAPI",
            path: "Sources/API"
        ),
        .target(
            name: "MyExtensions",
            path: "Sources/Extensions"
        ),
        // 可选:给每个包添加测试目标
        .testTarget(
            name: "MyAPITests",
            dependencies: ["MyAPI"],
            path: "Tests/APITests"
        ),
    ]
)

3. 在实验App里引入本地包

打开Xcode,选中你的实验App目标,进入「Package Dependencies」标签页,点击「+」按钮,选择「Add Local...」,然后选中刚才创建的Package.swift文件。导入完成后,你就可以在App的代码里导入MyAPI或MyExtensions来使用对应的功能了。

4. 在其他项目里复用这些包

如果其他项目需要用到这些功能,只要它们能访问到你的Git仓库,就可以通过SPM导入:

  • 在Xcode里添加Package依赖时,输入你的Git仓库URL(比如https://your-git-repo-url.git)。
  • 你还可以指定分支、标签或者commit哈希来控制版本,完全不需要子模块,SPM会自动拉取对应的代码。

额外小Tips

  • 可以给每个包添加测试目标,放在Tests文件夹里,和Sources的结构对应,保证代码质量。
  • 所有代码都在同一个Git仓库里,提交的时候一起提交就行,维护成本极低。
  • 以后如果想把某个包单独拆成独立仓库,直接把对应的Sources子文件夹移出去,新建一个Package.swift就行,迁移成本几乎为零。

内容的提问来源于stack exchange,提问作者Sti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:49:56