Swift Package:共享代码的双颜色资产库,Color扩展无法使用
解决Swift Package多颜色资产共享代码的问题
你的思路完全可行——可以创建两个共享核心代码、仅颜色资产不同的库,让用户通过SPM选择使用。问题出在核心代码的访问权限和Package.swift的配置细节上,下面是具体解决步骤:
1. 修正核心代码的访问权限
PackageName目标里的Color扩展默认是internal权限(仅能在同一目标内访问),必须改成public才能让依赖它的Library1/Library2以及外部项目调用。
修改你的Color扩展代码:
// 原来的默认internal代码 // extension Color { // static let primary = Color("Primary") // } // 修改为public权限 public extension Color { static let primary = Color("Primary") // 其他颜色扩展同理设置为public }
2. 调整Package.swift配置
确保核心目标PackageName的路径正确,Library1/Library2能正确依赖它,同时保证资源文件路径结构规范:
- 核心代码建议迁移到
Sources/PackageName子目录(如果原文件都在/Sources根目录,迁移后结构更清晰) - 在Package根目录创建
Resources文件夹,分别放入Library1.xcassets和Library2.xcassets,各自存放对应颜色资产
修改后的Package.swift示例:
let package = Package( name: "PackageName", platforms: [.iOS(.v14)], products: [ .library(name: "Library1", targets: ["Library1"]), .library(name: "Library2", targets: ["Library2"]) ], targets: [ // 核心代码目标:包含所有共享逻辑和Color扩展 .target( name: "PackageName", path: "Sources/PackageName" ), // 绑定Library1颜色资产的库 .target( name: "Library1", dependencies: ["PackageName"], resources: [.process("Resources/Library1.xcassets")] ), // 绑定Library2颜色资产的库 .target( name: "Library2", dependencies: ["PackageName"], resources: [.process("Resources/Library2.xcassets")] ), // 可选:测试目标 .testTarget( name: "PackageNameTests", dependencies: ["PackageName"] ) ] )
3. 验证使用流程
外部项目通过SPM添加你的包时:
- 只需选择
Library1或Library2作为依赖(无需选择PackageName) - 代码中直接调用
Color.primary这类扩展,系统会自动加载对应库的颜色资产
关键注意点
- 颜色资产的名称必须和
Color扩展里引用的名称完全一致(比如扩展用Color("Primary"),xcassets里就要有名为Primary的颜色) - 如果不想迁移核心代码目录,可将
PackageName目标的path设为"Sources",但分目录管理更利于后续维护
内容的提问来源于stack exchange,提问作者kartbnb
相关产品推荐
相关产品推荐

