How to include assets / resources in a Swift Package Manager library?

Using Swift 5.3 it's finally possible to add localized resources 🎉

The Package initializer now has a defaultLocalization parameter which can be used for localization resources.

public init(
    name: String,
    defaultLocalization: LocalizationTag = nil, // New defaultLocalization parameter.
    pkgConfig: String? = nil,
    providers: [SystemPackageProvider]? = nil,
    products: [Product] = [],
    dependencies: [Dependency] = [],
    targets: [Target] = [],
    swiftLanguageVersions: [Int]? = nil,
    cLanguageStandard: CLanguageStandard? = nil,
    cxxLanguageStandard: CXXLanguageStandard? = nil
)

Let's say you have an Icon.png which you want to be localised for English and German speaking people.

The images should be included in Resources/en.lproj/Icon.png & Resources/de.lproj/Icon.png.

After you can reference them in your package like that:

let package = Package(
    name: "BestPackage",
    defaultLocalization: "en",
    targets: [
        .target(name: "BestTarget", resources: [
            .process("Resources/Icon.png"),
        ])
    ]
)

Please note LocalizationTag is a wrapper of IETF Language Tag.

Credits and input from following proposals overview, please check it for more details.


The package manager does not yet have any definition for how resources will be bundled with targets. We are aware of the need for this, but don't yet have a concrete proposal for it. I filed https://bugs.swift.org/browse/SR-2866 to ensure we have a bug tracking this.