有时Xcode无法确定Bundle中的module
参数。
类型"Bundle"没有成员"module"
我的调查显示SPM在模块上为这个属性自动生成一个扩展名(有时),文件名为 * resource_bundle_accessor
*,如下所示:
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 = "ABUIKit_ABStyleKit"
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 ABUIKit_ABStyleKit")
}()
}
但有时候它不会。为什么会这样?我怎样才能让它自动工作再次(而不需要手动实现)。
这两种情况都发生在Xcode 12 beta.3上
更新
有时它显示:
由于"内部"保护级别,无法访问"模块"
它根本不显示文件。
7条答案
按热度按时间cgvd09ve1#
SPM仅在相应目标包含
resources
作为参数时生成 *resource_bundle_accessor
*,如下所示:另外,请注意它应该是有效的资源路径。
和️
项目必须实际上在目标的目录中包含
Resources
!和#️#️
不要忘记构建(cmd+b)代码来创建
.module
!3vpjnl9f2#
如果您看到如下错误:
错误:找到1个未处理的文件;显式声明它们为资源或从目标中排除
类型"Bundle"没有成员"module"
然后检查以下五种情况:
此时,编译器合成了一个包含以下内容的文件
resource_bundle_accessor.swift
:要检查文件是否确实已合成:
要从软件包中加载资源,请使用
Bundle.module
,例如:查找软件包捆绑包目录的路径:
要检查软件包捆绑包是否包含特定资源,例如图像:
以下是使用自定义目录的示例:
其中目录包括:
如果一切都失败了,您怀疑有bug,请检查bug database for SPM。
8ftvxx2r3#
好了,我找到了一个解决方案,Swift实际上生成了
Bundle.module
文件🎉documentation明确指出,由于SPM按目标来确定资源的范围,因此必须将
Resources
放在文件夹<project_root>/Sources/<MyTarget>/
下,我的repo SHSearchBar的目标定义如下所示(比较Github上的文件结构):目标文件夹:
<project_root>/Sources/SHSearchBar
资源文件夹:
<project_root>/Sources/SHSearchBar/Resources
顺便说一下,要从命令行构建iOS包,您可以使用此命令使用iOS 14 SDK:
为了使我的小文章完整,我还想提一下,使用
Bundle.module
方法的包也可以集成到运行在iOS〈14的应用程序中,因为生成的扩展不包含任何新的API👍sc4hvdpw4#
Bundle.module
仅在Package.swift
文件中的resources
不为空且指定资源实际存在时由SwiftPM生成。因此,有两个可能的原因说明它可能不适合您:
1.您没有在
Package.swift
中指定任何resources
。修复如下:1.指定的路径不存在或为空。
通过检查你是否已经把你的资源**放到
Sources/MyLibrary
**目录中来修复。一个常见的错误是把它们直接放到Sources
或其他目标子文件夹中。xmd2e60i5#
您也可以通过创建一个带有static let的类来公开bundle:
然后,您可以在公共类中访问它并使用它:
gojuced76#
在我的例子中,我尝试了所有的解决方案,但在重新启动Xcode之前没有任何帮助。
在Xcode 14.0.0上完成
oipij1gg7#
1.确保
Resources
文件夹存在并且其中包含文件1.当
Resources
文件夹不为空时,XCode会自动生成Bundle.module
。但它是internal
1.添加
@testable import YourPackage
to make可以使包源代码中的内部文件可用于测试。