Visión de conjunto
Tengo dos dependencias, una disponible como paquete Swift y la otra solo disponible como Cocoapod. El problema es que cada uno tiene una dependencia de un tercer paquete, lo que da como resultado un comportamiento indefinido cuando existen varias versiones.
En un nivel básico, aquí hay un gráfico de mis dependencias.
APP imports: B (SPM) imports: C (SPM) imports: D (SPM) <- E (Pod) imports: D (Pod) <- Me gustaría eliminar la versión D (Pod) y apuntar a la versión D (SPM) , ya sea a través de un script de Podfile o un script de compilación.
Información más específica:
Tengo un paquete Swift de NetworkingService que importa Firebase y mi aplicación principal importa NetworkingService. Mi Podfile importa GoogleMLKit/PoseDetection . Firebase y PoseDetection comparten dependencias que dan como resultado un comportamiento indefinido (bloqueo del tiempo de ejecución) cuando hay un duplicado presente.
Nota: Este error debería poder reproducirse eliminando el paquete NetworkingService intermediario e importando Firebase a la aplicación principal como un paquete Swift.
Podfile
platform :ios, '15.0' target 'MyApp' do use_frameworks! pod 'GoogleMLKit/PoseDetection', '2.5.0' endEn paquete.swift
.package( name: "Firebase", url: "https://github.com/firebase/firebase-ios-sdk.git", .upToNextMajor(from: "8.10.0") ), Duplican algunas dependencias, incluidas GoogleUtilities y FBLPromises . El inicio de la aplicación después de que la pod install falla con una excepción de tiempo de ejecución:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FBLPromise HTTPBody]: unrecognized selector sent to instance 0x6000017685d0'La búsqueda me llevó a este problema de GitHub donde un colaborador menciona:
Las advertencias duplicadas son indicativas de un comportamiento no determinista. Cuando hay múltiples copias de una biblioteca, se puede elegir o no la correcta.
Luego intenté refactorizar todas las dependencias de Cocoapod con una versión modificada de este script que encontré vinculado en otra publicación de StackOverflow. El intento fue hacer que PoseDetection apuntara explícitamente a símbolos de GoogleUtilitiesCopy y FBLPromisesCopy . Pero parece que incluso la existencia de estas copias, a pesar de señalar la dependencia correspondiente, creó un comportamiento indefinido.
Solución parcial
Si ejecuto pod install seguido de File > Packages > Update to latest package versions . La aplicación se iniciará sin un bloqueo de tiempo de ejecución inmediato. Sin embargo, encuentro otros bloqueos de tiempo de ejecución más adelante dentro de la aplicación.***
Solución ideal
Me gustaría eliminar las dependencias de pod duplicadas y apuntar a las versiones de SPM a través de Podfile o un script de fase de compilación, pero no estoy seguro de por dónde empezar.
Firebase se puede importar como un pod, pero no quiero hacerlo porque tengo una infraestructura SPM existente que depende de Firebase. Preferiría no convertir todos estos paquetes en pods.