Создание resource_bundle_accessor, тип "Bundle" не имеет члена "module" - PullRequest
2 голосов
/ 04 августа 2020

Иногда Xcode не может определить параметр 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

Обновление

Иногда показывает:

«модуль» недоступен из-за «внутреннего» уровня защиты

И не отображается файл вообще.

Ответы [ 3 ]

0 голосов
/ 14 августа 2020

Bundle.module будет сгенерировано SwiftPM только в том случае, если resources в файле Package.swift не пустое и указанные ресурсы действительно существуют.

Итак, есть две возможные причины , почему это может не сработать для вас:

  1. У вас нет resources, указанного в Package.swift. Исправьте вот так:
.target(
    name: "MyLibrary",
    dependencies: [
        /* your dependencies */
    ],
    resources: [
        .copy("JsonData"),
        .process("Assets.xcassets"),
    ]
),

Указанные пути не существуют или пусты.

Исправьте, проверив, действительно ли вы поместили свои ресурсы в каталог Sources/MyLibrary. Распространенной ошибкой является размещение их непосредственно в Sources или в другой подпапке целей.

0 голосов
/ 01 сентября 2020

Хорошо, я нашел решение, поэтому 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")]
        )
    ]

Целевая папка: <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"

Чтобы сделать мой небольшой пост здесь завершен Я также хочу упомянуть, что пакет, использующий подход Bundle.module, может быть интегрирован в приложения, которые работают на iOS <14, так как сгенерированное расширение не содержит никакого нового API ? ​​</p>

0 голосов
/ 04 августа 2020

SPM генерирует resource_bundle_accessor, только если соответствующая цель содержит resources в качестве аргумента, например:

    .target(
        name: "ChenzookKit",
        dependencies: ["Apollo"],
        resources: [.process("Resources")] // <- `copy` or `process` deson't really matter 
    ),

Также обратите внимание, что это должен быть допустимый путь к ресурсу.

...