Moj*_*ini 22 xcode bundle swift swift-package-manager
有时 Xcode 无法确定moduleBundle 中的参数。
类型“捆绑”没有成员“模块”
我的调查表明,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")
}()
}
Run Code Online (Sandbox Code Playgroud)
但有时不会。为什么会这样,我怎样才能让它再次自动工作(无需手动实现。)
这两种情况都发生在Xcode 12 beta.3 上
有时显示:
由于“内部”保护级别,“模块”无法访问
它根本不显示文件。
Moj*_*ini 29
resource_bundle_accessor仅当相应的目标包含resources以下参数时,SPM才会生成:
.target(
name: "ChenzookKit",
dependencies: ["Apollo"],
resources: [.process("Resources")] // <- `copy` or `process` deson't really matter
),
Run Code Online (Sandbox Code Playgroud)
另请注意,它应该是有效的资源路径。
该项目必须实际上包含Resources 在目标的目录中!
不要忘记构建(cmd+ b)代码来.module创建它!
Jan*_*ano 10
如果你看到这样的错误:
错误:找到 1 个未处理的文件;明确地将它们声明为资源或从目标中排除
类型“捆绑”没有成员“模块”
然后查看以下五个条件:
1.检查您的 Package.swift 的第一行是否声明使用 swift-tools-version:5.3 或更高版本。
// swift-tools-version:5.3
Run Code Online (Sandbox Code Playgroud)
2.检查资源文件夹是否在目标文件夹下。例如,
Sources/MyTarget/Resources
Tests/MyTargetTests/Resources
Run Code Online (Sandbox Code Playgroud)
3.检查您是否已添加至少一项资源。例如,
Tests/MyTargetTests/Resources/paginatedLabels.json
Run Code Online (Sandbox Code Playgroud)
4.通过使用 Xcode 打开文件 Package.swift 来检查您是否打开了包。
5.检查 Package.swift 文件是否声明了一个资源元素,如下所示:
.testTarget(
name: "MyTargetTests",
dependencies: ["MyTarget"],
resources: [
.process("Resources")
]
),
Run Code Online (Sandbox Code Playgroud)
此时,编译器合成了一个resource_bundle_accessor.swift包含这个内容的文件:
// swift-tools-version:5.3
Run Code Online (Sandbox Code Playgroud)
要检查文件是否确实已合成:
Sources/MyTarget/Resources
Tests/MyTargetTests/Resources
Run Code Online (Sandbox Code Playgroud)
要从包包中加载资源,请使用Bundle.module,例如
Tests/MyTargetTests/Resources/paginatedLabels.json
Run Code Online (Sandbox Code Playgroud)
要查找包包目录的路径:
.testTarget(
name: "MyTargetTests",
dependencies: ["MyTarget"],
resources: [
.process("Resources")
]
),
Run Code Online (Sandbox Code Playgroud)
要检查包 bundle 是否包含特定资源,例如图像:
extension Foundation.Bundle {
static var module: Bundle = {
...
Run Code Online (Sandbox Code Playgroud)
如果一切都失败并且您怀疑存在错误,请检查SPM的错误数据库。
好的,我找到了一个解决方案,所以 Swift 实际上生成了该Bundle.module文件
该文档明确指出,您必须将其放在Resources该文件夹下<project_root>/Sources/<MyTarget>/,因为 SPM 按目标确定资源范围。我的存储库SHSearchBar 的目标定义如下所示(比较 Github 上的文件结构):
// swift-tools-version:5.3
import PackageDescription
targets: [
.target(
name: "SHSearchBar",
resources: [.copy("Resources")]
)
]
Run Code Online (Sandbox Code Playgroud)
目标文件夹:<project_root>/Sources/SHSearchBar
资源文件夹:<project_root>/Sources/SHSearchBar/Resources
顺便说一句,要从命令行构建 iOS 包,您可以使用以下命令使用 iOS 14 SDK:
swift build -Xswiftc "-sdk" -Xswiftc "\`xcrun --sdk iphonesimulator --show-sdk-path\`" -Xswiftc "-target" -Xswiftc "x86_64-apple-ios14.0-simulator"
Run Code Online (Sandbox Code Playgroud)
为了使我的小帖子完整,我还想提一下,使用该Bundle.module方法的包也可以集成到在 iOS <14 上运行的应用程序中,因为生成的扩展不包含任何新的 API
| 归档时间: |
|
| 查看次数: |
4273 次 |
| 最近记录: |