iOS Xcode SPM no pudo exigir la superclase

9

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?

dtmokada
fuente

Respuestas:

2

Xcode con dependencias SPM no puede manejar la misma dependencia SPM en múltiples destinos que dependen uno del otro en este momento. Cada dependencia debe estar solo en un objetivo en este momento. No sé por qué a partir de ahora, pero intentaré investigar más y registrar el error si aún no está archivado.

Zdeněk Topič
fuente
Hola, ¿alguna suerte descubriendo más?
janh
¿Encontraste algo sobre esto?
Bogen
Nada hasta ahora :) El problema realmente es que vincula las dependencias estáticamente en los objetivos.
Zdeněk Topič
0

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.swiftpara que RxTestsea ​​una biblioteca dinámica, debería funcionar. Puede probar esto fácilmente clonando RxSwifty modificando esta línea:

.library(name: "RxTest", targets: ["RxTest"]),

dentro:

.library(name: "RxTest", type: .dynamic, targets: ["RxTest"]),

y luego arrastrando la copia local de RxSwiftsu 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 RxSwiftcomunidad para que cambie sus productos a versiones dinámicas o de venta dinámica además de las predeterminadas.

3) No use RxTesto 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.

bscothern
fuente
Clonar y modificar cada dependencia no me parece una solución. La mayoría de los paquetes están usando el tipo predeterminado, que es algo automático, creo, y elige enlaces estáticos cada vez por alguna razón. Esperaría que, dado que el paquete está vinculado en múltiples objetivos, elegiría vincularlo dinámicamente.
Zdeněk Topič
Ya es un dolor. Estoy de acuerdo en que la dinámica sería el comportamiento esperado aquí. Lo mejor que podemos hacer para cambiar eso es presentar una solicitud de comentarios con Apple.
bscothern