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
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")
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")
}()
}