如何将Swift Package中的资源文件复制到App中?
解决Swift Package资源无法复制到App的问题
1. 修正Package.swift的资源路径配置
你的目录结构中,资源目录UnicodeData与代码目录UnicodeNames同级,均位于Sources下。当前.copy("UnicodeData")是基于UnicodeNames目标的源代码目录(即Sources/UnicodeNames)查找资源,自然无法定位到正确路径。需明确指定资源的相对路径:
修改Package.swift中的target配置:
.target( name: "UnicodeNames", resources: [ // 指定相对于目标目录的上级路径,将UnicodeData目录完整复制到模块中 .path("../UnicodeData", directory: true, copyTo: "UnicodeData") ] ),
更简便的方式是将UnicodeData目录移动到Sources/UnicodeNames下,此时原配置.copy("UnicodeData")即可生效,因为资源与代码文件同属目标目录。
2. 使用正确的Bundle获取资源
Swift Package会自动为每个目标生成Bundle.module属性,专门用于访问模块内资源,比Bundle(for: Self.self)更可靠(后者可能误获取主App bundle或其他框架的bundle)。修改资源调用代码:
// 替换原Bundle获取逻辑 let bundle = Bundle.module if let myResource = bundle.path(forResource: "flatUnicode", ofType: "txt") { // 后续业务逻辑 }
3. 验证资源嵌入情况
重新编译项目后,查看App包内容:
- 打开App包的
Frameworks目录,找到UnicodeNames.framework - 右键选择「显示包内容」,检查是否存在
UnicodeData目录及对应的txt文件
若资源出现在框架内,说明配置正确,此时Bundle.module可正常访问资源。
额外注意事项
- 路径歧义规避:单个资源文件直接用
.copy("filename.txt");目录资源需确保路径指向准确。 - 清理编译缓存:执行
Product > Clean Build Folder后重新编译,避免旧缓存导致资源未更新。
内容的提问来源于stack exchange,提问作者Łukasz
相关产品推荐
相关产品推荐

