Swift Package 如何排除Git根目录下无需纳入包的非必要文件?
问题解答
核心结论
你遇到的是Xcode的默认展示逻辑和SPM配置的作用范围不匹配的问题,exclude和sources配置本身是生效的,只是不会影响Xcode导航栏的文件展示:
- SPM只要通过Git仓库地址引入依赖,就必然会拉取完整的仓库内容,Xcode会把拉取到的本地缓存仓库的所有文件全部展示在导航栏,这一行为无法通过
Package.swift的配置修改。 exclude和sources的作用是控制SPM构建包时参与编译、打包的文件范围,不会参与构建的冗余文件哪怕展示在导航栏,也不会影响最终App的大小和功能。
优化方案
如果要减少冗余文件的展示,或者完全避免冗余文件被拉取,可以参考以下两种方案:
方案1:优化仓库目录结构(仍通过Git分发)
你当前把target的path设为根目录的操作反而放大了冗余文件的展示问题,调整目录结构即可大幅优化观感:
- 把所有不需要对外暴露的文件(README、更新日志、Demo Workspace、脚本、原始ObjC Framework等)全部移动到根目录下单独的
Internal文件夹中 - 修改
Package.swift配置,删除target的path配置(恢复默认的Sources/[TargetName]路径即可),简化后的target配置如下:
.target( name: "WrapperSwiftPackage", dependencies: [ "ObjCFramework1", "ObjCFramework2" ], // 不需要额外设置path,用默认路径即可 exclude: ["Internal"], sources: ["main.swift"] // 路径相对于Sources/WrapperSwiftPackage )
调整后Xcode导航栏里的冗余文件只会集中在Internal文件夹下,不会散列在根目录,不会干扰正常使用。
方案2:精简打包分发(完全隐藏冗余文件)
如果要完全避免冗余文件被用户拉取,可以放弃直接用源码仓库作为SPM依赖地址,改用精简包分发:
- 导出包内必须的文件:仅保留
Package.swift、Sources目录、XCFrameworks目录,删除所有其他冗余文件 - 把上述文件打包为Zip压缩包,计算压缩包的校验值(执行命令
swift package compute-checksum [你的包路径.zip]即可获取) - 修改
Package.swift里的binaryTarget配置,把path参数替换为url(Zip包的托管地址)和checksum(上一步得到的校验值) - 把修改后的
Package.swift单独上传到一个专用的SPM分发仓库,用户通过这个仓库地址引入依赖时,拉取到的只有精简后的内容,不会有任何冗余文件。
现有配置优化提示
你当前的配置里把XCFrameworks/ObjCFramework1.xcframework和XCFrameworks/ObjCFramework2.xcframework同时加入了target的sources,这是多余操作,因为你已经通过dependencies声明了对两个binaryTarget的依赖,重复添加不会有额外作用,建议删除。
内容的提问来源于stack exchange,提问作者JimmyJammed
相关产品推荐
相关产品推荐

