Mi aplicación se compone de muchos proyectos (marcos), uno para cada característica principal y un marco común con todo tipo de cosas a las que necesito acceder en varias de mis características.
Estoy usando el Administrador de paquetes Swift de Xcode 11 para agregar dependencias.
El marco común contiene una dependencia RxSwift, que utilizo en todo el proyecto.
Tengo problemas cuando intento usar RxTest en cualquiera de mis marcos de funciones.
Si agrego RxTest a través de SPM al objetivo de prueba directamente y ejecuto las pruebas, obtengo
no pudo exigir la superclase de 'nombre de clase' del nombre destrozado 'otro nombre de clase'
Y muchos
La clase 'nombre de clase' se implementa tanto en 'ruta de marco común' como en 'ruta de destino de prueba'
donde todas estas clases están relacionadas con Rx. El error 'falló al demangle' bloquea la prueba y solo ocurre cuando intento inicializar una clase RxTest.
Si agrego RxTest al marco común, las pruebas funcionan bien, pero cuando ejecuto la aplicación, obtengo
dyld: Biblioteca no cargada: @ rpath / XCTest.framework / XCTest
Lo cual tiene sentido, porque estoy agregando un marco de prueba a un marco que no es de prueba, y no es algo bueno para hacer.
Básicamente, no pude obtener una configuración en la que tanto las pruebas como la aplicación funcionen bien. O se ejecuta la aplicación o se ejecutan las pruebas.
¿Cómo puedo hacer que esto funcione? ¿Hay alguna manera de incluir RxTest en el marco común solo cuando lo construyo en un objetivo de prueba? ¿O debería incluirse RxTest en los objetivos de prueba y me falta alguna configuración?
fuente
Es probable que su problema sea que la biblioteca esté usando enlaces estáticos en lugar de enlaces dinámicos. En SwiftPM puede especificar que una biblioteca sea estática o dinámica si lo desea o simplemente puede dejar que el sistema de compilación decida qué es lo que hacen la mayoría de los paquetes. Xcode parece favorecer el enfoque estático cuando se compila con SwiftPM, lo que resulta en los problemas de compilación que está experimentando.
Si modifica el
Package.swift
para queRxTest
sea una biblioteca dinámica, debería funcionar. Puede probar esto fácilmente clonandoRxSwift
y modificando esta línea:dentro:
y luego arrastrando la copia local de
RxSwift
su Xcode Project Navigator. Luego usará su copia local del paquete en lugar de la clonada por Xcode.Una vez que haga esto, puede vincularlo con cualquier objetivo que necesite y debería funcionar. Si eso realmente soluciona el problema, entonces es probable que sus soluciones a largo plazo:
1) Tenga una bifurcación que simplemente la cambie a una biblioteca dinámica.
2) Convencer a la
RxSwift
comunidad para que cambie sus productos a versiones dinámicas o de venta dinámica además de las predeterminadas.3) No use
RxTest
o cosas similares en varios lugares.También vale la pena señalar que Xcode 11.3 y versiones anteriores no admiten el archivado con paquetes dinámicos Swift. Entonces, si baja por la ruta dinámica, tendrá que esperar a Xcode 11.4.
fuente