生成 resource_bundle_accessor,类型 'Bundle' 没有成员 'module'

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创建它!

  • 我已经做到了这一点,但没有运气:( (6认同)
  • 它对我有用,资源文件夹必须不为空! (3认同)
  • 未来的读者,这些解决方案似乎还不适用于 Swift 5.5 和可执行目标:参见。[关于错误报告的评论](https://bugs.swift.org/browse/SR-13773?focusedCommentId=64312&amp;page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-64312) 和我自己的经历 (2认同)

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错误数据库


bla*_*acx 7

好的,我找到了一个解决方案,所以 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