Swift Package Manager本地实用吗?代码复用相关技术咨询
嘿,你的需求完全可行!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

