Search code examples
swiftxcodeswift-package-manager

Swift Package Manager - Type 'Bundle' has no member “module” error


Working on implementing SPM for a framework, and got stuck on the Type 'Bundle' has no member “module” error.

I have seen two other recent posts about this here and here, but following all the steps, it is still not working for me, no resource_bundle_accessor file is generated.

I asked about my Package.swift file here, and that has been answered and resolved. For completeness here's the file:

// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "BioSwift",
    products: [
        // Products define the executables and libraries a package produces, and make them visible to other packages.
        .library(
            name: "BioSwift",
            targets: ["BioSwift"]
        )
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages this package depends on.
        .target(
            name: "BioSwift",
            dependencies: [],
            resources: [
                  .process("Resources")
                ]
        ),
        .testTarget(
            name: "BioSwiftTests",
            dependencies: ["BioSwift"]
        )
    ]
)

I get the Type 'Bundle' has no member “module” error when trying to access one of the resources in the bundle:

public let unimodURL = Bundle.module?.url(forResource: "unimod", withExtension: "xml")

The project is on GitHub here


Solution

  • Besides all errors in the test file, the only issue remains is that module is not an optional. To fix that, just change this:

    public let unimodURL = Bundle.module?.url(forResource: "unimod", withExtension: "XML")
    

    to:

    public let unimodURL = Bundle.module.url(forResource: "unimod", withExtension: "xml")
    

    Update:

    If you use .xcodeproj file, you will continue seeing this error. You should consider opening it with the package.swift or import it as a package (instead of converting it to a project)!

    by the way, here is the generated file, so you can add it as a development asset when you are working with the xcodeproject:

    import class Foundation.Bundle
    
    private class BundleFinder {}
    
    extension Foundation.Bundle {
        /// Returns the resource bundle associated with the current Swift module.
        static var module: Bundle = {
            let bundleName = "BioSwift_BioSwift"
    
            let candidates = [
                // Bundle should be present here when the package is linked into an App.
                Bundle.main.resourceURL,
    
                // Bundle should be present here when the package is linked into a framework.
                Bundle(for: BundleFinder.self).resourceURL,
    
                // For command-line tools.
                Bundle.main.bundleURL,
            ]
    
            for candidate in candidates {
                let bundlePath = candidate?.appendingPathComponent(bundleName + ".bundle")
                if let bundle = bundlePath.flatMap(Bundle.init(url:)) {
                    return bundle
                }
            }
            fatalError("unable to find bundle named BioSwift_BioSwift")
        }()
    }