google - Configuración de Cocoapods con una biblioteca estática existente y una aplicación de iOS
maps swift 3 (2)
Tengo problemas para que mi espacio de trabajo se compile correctamente con Cocoapods. Hay 3 proyectos en el área de trabajo, cada uno con su propio objetivo:
- libPods - biblioteca estática de Cocoapods con todas las dependencias externas
- libCommon - Mi biblioteca estática donde guardo todo mi código compartido (controladores base, código de red, UI común, etc.)
- myApp - Mi aplicación iOS
Tanto libCommon como myApp requieren las dependencias externas de los libPods. Originalmente pensé que funcionaría así:
- compilaciones libPods
- enlaces libCommon contra libPods y compilaciones
- myApp enlaza con libCommon y compila
En este escenario, libCommon "posee" los pods, y luego myApp simplemente se vincula con libCommon como siempre he hecho antes de Cocoapods ... pero a las bibliotecas aparentemente no les gusta estar vinculadas con bibliotecas estáticas (tengo un montón de errores de la biblioteca dinámica). Leí sobre un tema de github en algún lugar que, en cambio, debería compilar libPods y libCommon y luego myApp debería enlazar con ambas bibliotecas. En este momento mi podfile se ve algo como esto:
workspace ''MyApp.xcworkspace''
platform :ios, ''5.0''
link_with [''Common'', ''MyApp'']
target ''MyApp'' do
xcodeproj ''MyApp.xcodeproj''
pod ''AFNetworking'', ''1.1.0''
pod ''TTTAttributedLabel'', ''1.6.0''
pod ''JSONKit'', ''1.5pre''
pod ''Reachability'', ''3.1.0''
end
Con esta configuración, myApp posee todos los pods, y luego en la configuración de compilación de libCommon especifico la ruta a los encabezados de pod. Esto se hace bien hasta que intento usar una de las clases en libCommon. Una vez que hago eso, recibo uno de esos _OBJC_CLASS_$_Blah
(lo que me dice que aunque los encabezados están disponibles, todavía no están vinculados correctamente). Cuando trato de vincular manualmente libCommon en "Build Phases" obtengo un montón de errores de símbolos duplicados (¿lo que me hace creer que ya está vinculado?). ¿Qué diablos?
¿Cuál es la forma de hacerlo correctamente y cómo debería verse mi podfile?
CocoaPods crea un objetivo raíz implícito que, de forma predeterminada, enlaza con el primer objetivo del proyecto. A medida que va creando otro destino y la opción link_with no es heredada por las definiciones de destino secundarias, su configuración no funciona. Para hacer la opción link_with, puede moverla dentro del bloque de la definición de destino MyApp.
Como el objetivo común se vincula con los Pods, si los vincula con MyApp, se producirá un error de símbolos duplicados, ya que la aplicación se vincula con Common. En este caso, solo debe hacer que los encabezados estén disponibles para el destino MyApp. Esto es simple de hacer, pero aún no existe un DSL adecuado, así que por el momento es un poco pirateado como una solución (pero es compatible).
workspace ''MyApp.xcworkspace''
platform :ios, ''5.0''
target ''Common'' do
pod ''AFNetworking'', ''1.1.0''
pod ''TTTAttributedLabel'', ''1.6.0''
pod ''JSONKit'', ''1.5pre''
pod ''Reachability'', ''3.1.0''
target ''MyApp'', :exclusive => true do
xcodeproj ''MyApp.xcodeproj''
end
end
La solución que he adoptado para esta situación es la siguiente:
Configuré el Podfile simplemente:
workspace ''MyApp.xcworkspace''
platform :ios, ''5.0''
xcodeproj ''Common.xcodeproj''
pod ''AFNetworking'', ''1.1.0''
pod ''TTTAttributedLabel'', ''1.6.0''
pod ''JSONKit'', ''1.5pre''
pod ''Reachability'', ''3.1.0''
target ''MyApp'' do
xcodeproj ''MyApp.xcodeproj''
# specific dependencies
end
De esta manera, Common lib y MyApp se configuran correctamente para usar todas las dependencias. Sin embargo, esto todavía causará símbolos duplicados. La forma de solucionarlo es simplemente eliminar libPods.a de la fase de compilación del proyecto común. Esto está bien porque de todos modos no queremos vincular la biblioteca estática de Cocoapods a nuestra biblioteca estática. Todas las dependencias correctas se vincularán cuando construyas la aplicación, y todas las rutas de encabezado correctas se configuran en los archivos .xccconfig, por lo que Xcode / AppCode aún proporcionará todas las autocompletaciones y todo se compilará.
Tendrá que eliminar los libPods.a cada vez que ejecute la pod install
cual es un poco molesto, pero podría ser mejor sufrir eso que administrar todas las dependencias manualmente.
Actualización: estoy trabajando en esto mientras escribo y me he dado cuenta de que es importante no utilizar las configuraciones de Cocoapods Linker Flags dentro de su biblioteca estática. De forma predeterminada, mi biblioteca estática había invalidado su valor sin ningún valor, pero Cocoapods advierte contra esto y le aconseja que use $ (heredado). Simplemente ignóralo.