es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Administrador de Paquetes de Swift – Realm como una subdependencia de un paquete integrado – No es posible realizar pruebas en el proyecto principal.

Configuración

iOS, xCode 13, Realm 10.20

MainProject integra dos paquetes Swift utilizando Swift Package Manager: LayerPersistence y LayerNetwork.

El paquete LayerPersistence tiene una dependencia de

  • Realm

El paquete LayerNetwork tiene una dependencia de

  • Alamofire

MainProject se compila y se ejecuta sin problemas.
Las pruebas para MainProject no se compilan. Genera lo siguiente:

Error: Módulos requeridos que faltan: 'Realm.Private', 'Realm'

Cuando excluyo LayerPersistence de MainProject, las pruebas se ejecutan sin problemas.

Lo que he intentado y no ha funcionado

He intentado asignar manualmente el módulo con: -fmodule-map-file=.....alguna ruta al archivo.....Realm.modulemap pero sin éxito.

He intentado incluir manualmente Realm en la sección “Link Binary With Libraries” de los objetivos de prueba.

Lo que funciona

La solución es retroceder a la versión 5.5.2 de Realm en LayerPersistence y vincular manualmente Realm a todos los objetivos de prueba de MainProject a través de

Build Phases -> Link Binary With Libraries

esto soluciona el problema, pero me mantiene fuera de las nuevas versiones de Realm.

Objetivo

Tener la versión más reciente de Realm en el paquete integrado a través de SPM y aún así poder ejecutar pruebas en MainProject


Nota:

Las pruebas en LayerPersistence y LayerNetwork se ejecutan sin problemas.

Existen algunas soluciones en Internet, pero no resuelven los problemas con las versiones más nuevas de Realm:

https://github.com/apple/swift-nio/issues/1128

https://github.com/realm/realm-swift/issues/6301

https://stackoverflow.com/questions/58125428/missing-required-module-xyz-on-unit-tests-when-using-swift-package-manager/58573799

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema aquí es que el módulo Realm no está siendo encontrado por el objetivo de prueba, aunque está siendo enlazado correctamente con el objetivo del Proyecto Principal. Esto se debe a que el objetivo de prueba es un módulo separado y necesita declarar explícitamente sus dependencias.

    Para solucionar este problema, puedes añadir las siguientes dependencias a tu objetivo de prueba en el archivo Package.swift:

    .testTarget(
        name: "MainProjectTests",
        dependencies: [
            .target(name: "MainProject"),
            .product(name: "RealmSwift", package: "Realm")
        ]
    )
    

    Esto le indica al Gestor de Paquetes Swift que incluya el producto RealmSwift como una dependencia del objetivo MainProjectTests.

    Además, es posible que también necesites añadir -Xlinker -add_ast_path -Xlinker a la configuración de compilación de tu objetivo de prueba para asegurarte de que el módulo Realm se cargue correctamente.

    swiftSettings: [
        .unsafeFlags([
            "-Xlinker",
            "-add_ast_path",
            "-Xlinker",
            "${BUILT_PRODUCTS_DIR}/${SWIFT_PLATFORM_TARGET_PREFIX}MainProject.framework/Modules/MainProject.swiftmodule/"
        ])
    ],
    

    Con estos cambios, tu objetivo de prueba debería ser capaz de encontrar el módulo Realm y ejecutarse correctamente, incluso con la última versión de Realm.

Comments are closed.