Table of Contents
Introducción a la administración de dependencia en iOS
El desarrollo moderno de iOS raramente comienza desde cero. Las bibliotecas de terceros manejan todo desde redes y JSON analizando componentes de la interfaz de usuario y caché de imágenes. Sin un enfoque estructurado, descargando manualmente marcos, resolviendo conflictos de versiones y vinculando binarios rápidamente se convierte en una pesadilla de mantenimiento.
CocoaPods y Carthage son las dos herramientas más establecidas para gestionar dependencias en proyectos iOS. Mientras CocoaPods ofrece una integración simplificada y basada en el espacio de trabajo, Carthage sigue una filosofía descentralizada, de construir-it-yourself. Entender las fortalezas y los intercambios de cada uno ayuda a elegir el enfoque correcto para su equipo, su aplicación y su tubería de implementación.
CocoaPods: Centralizado y Automatizado
CocoaPods ha sido el gerente de dependencia dominante desde su introducción. Utiliza un índice central llamado CocoaPods Specs y genera un espacio de trabajo Xcode que maneja todas las dependencias automáticamente. Esto significa que puede agregar una biblioteca simplemente declarándola en un Podfile, ejecutar un comando, e inmediatamente empezar a importarlo en su código.
Instalación y configuración
CocoaPods se instala a través de RubyGems. macOS barcos con Ruby, pero es posible que necesite actualizar o utilizar un gestor de versiones de Ruby. El comando de instalación estándar es:
sudo gem install cocoapods
Después de la instalación, navega a su directorio de proyecto e inicia un Podfile:
pod init
Esto crea un archivo de texto simple llamado Podfile. Luego lo editas para especificar tu plataforma de destino, cualquier bandera (requierida para bibliotecas Swift), y las dependencias que necesitas. Un típico Podfile se ve así:
platform :ios, '15.0'
target 'MyApp' do
use_frameworks!
pod 'Alamofire', '~> 5.7'
pod 'SwiftyJSON', '~> 5.0'
pod 'SDWebImage', '~> 5.15'
end
Una vez que el Podfile esté listo, corre:
pod install
CocoaPods descarga las versiones especificadas, resuelve las dependencias y genera un archivo . Desde ese punto, debe abrir el espacio de trabajo, no el original —para construir y ejecutar su aplicación.
Características avanzadas de los cacaopodos
- Subespecie: Muchas bibliotecas le permiten importar sólo un subconjunto de su funcionalidad. Por ejemplo, reduce la huella binaria.
- Senderos locales: Se puede apuntar a una carpeta local para bibliotecas privadas:
- Fuentes basadas en los valores: Las dependencias pueden provenir de cualquier repositorio de Git:
- Podfile.lock: Este archivo bloquea cada dependencia a una versión específica, asegurando que se construyen reproducibles en todo su equipo y en el CI.
- Plugins: Puedes ampliar CocoaPods con plugins para SwiftLint, Firebase o scripts de construcción personalizados.
CocoaPods también admite objetivos multiplataforma. Puedes tener diferentes conjuntos de dependencia para iOS, macOS y watchOS anidando bloques dentro de un único Podfile.
Ganchos de puestos y personalización
Una necesidad común es ejecutar un script después de cada . Por ejemplo, usted podría querer despojar arquitecturas simuladoras de las construcciones de liberación. Esto se hace con un gancho :
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
end
end
end
Tales ganchos le dan un control bien arraigado sobre el proyecto de Pods generado, pero también añaden complejidad. El uso excesivo puede hacer que su Podfile sea difícil de leer y mantener.
Carthage: Decentralizado y Manos-Off
Carthage toma un enfoque diferente. En lugar de centralizar metadatos, se basa en etiquetas Git y los proyectos Xcode reales de cada biblioteca. Carthage construye los marcos en su máquina y deja el paso de integración —trayendo marcos en su proyecto Xcode— muy a su disposición. Esta mínima interferencia es atractivo para los desarrolladores que quieren un control completo y una huella más pequeña en su control de versiones.
Instalación y configuración
El cartaje se instala normalmente a través de Homebrew:
brew install carthage
A continuación, crear un archivo de texto simple llamado Cartfile] en su raíz del proyecto. La sintaxis es similar a CocoaPods pero apunta a los repositorios GitHub o a cualquier fuente de Git:
github "Alamofire/Alamofire" ~> 5.7
github "SwiftyJSON/SwiftyJSON" ~> 5.0
github "onevcat/Kingfisher" ~> 7.0
Después de editar el Cartucho, ejecute:
carthage update --platform iOS
Este comando clona los repositorios, revisa las versiones etiquetadas y construye los marcos usando Xcode. Los binarios resultantes se colocan en la carpeta Carthage/Build/iOS. Luego, arrástrelos manualmente en su proyecto Xcode bajo la sección "Frameworks, Libraries y Contenido Embeddedado", asegurándose de agregarlos al objetivo adecuado.
Diferencias clave de CocoaPods
- Ningún espacio de trabajo: Carthage no modifica su archivo de proyecto. Usted se mantiene en control de las referencias de archivos y la configuración de construcción.
- Velocidad de construcción: Carthage puede crear caché. En el CI, puede preconstruir dependencias para acelerar el oleoducto.
- Versioning:] Carthage utiliza un Cartfile.resolved para bloquear versiones, similar a Podfile.lock.
- Marcos binarios: Algunas bibliotecas envían binarios. El cartaje puede descargarlos directamente, saltando el paso de la construcción y ahorrando tiempo.
- XCFramework support: Desde el Carthage 0.38, puede producir XCFrameworks, que trabajan sin problemas con Swift Package Manager y eliminan la necesidad de despojar arquitecturas simuladoras.
Marco de gestión con dependencias
Un desafío con Carthage es que construye dependencias en secuencia. Si la biblioteca A depende de la biblioteca B, debe enumerar ambos en el Cartucho. Carthage resuelve el árbol de dependencia automáticamente, pero todavía necesita vincular todas las dependencias transitivas en su proyecto manualmente. Esto le da visibilidad a cada binario en el que se vincula su aplicación, pero también aumenta la posibilidad de perder un marco requerido en tiempo de ejecución.
Comparando CocoaPods y Cartago: Guía práctica
Elegir entre los dos depende del tamaño de su proyecto, la madurez del equipo y el flujo de trabajo de despliegue.
| Factor | CocoaPods | Carthage |
|---|---|---|
| Setup complexity | Low – one command, workspace generated automatically. | Medium – requires manual linking of frameworks. |
| Build system control | Lower – CocoaPods merges project files and may override build settings. | Higher – you control project structure and build phases. |
| Integration with Xcode | Tight – workspace includes Pods project, all configurations preset. | Loose – you add frameworks manually; no workspace changes. |
| CI/CD compatibility | Good – pod install works reliably in CI, but full rebuild on each run if lockfile changes. |
Excellent – prebuilt frameworks can be cached; build times are faster. |
| Swift Package Manager migration | Can coexist but may cause conflicts if both manage the same library. | Can coexist more easily because Carthage does not modify project files. |
| Community and library availability | Widest coverage – almost every popular library has a CocoaPods spec. | Good coverage – but some niche libraries may not be Carthage-friendly. |
Cuándo utilizar CocoaPods
- Estás empezando un nuevo proyecto y quieres caldera mínima.
- Su equipo incluye desarrolladores junior que se benefician de una integración desactivada.
- Necesitas una biblioteca que solo esté disponible a través de CocoaPods (aún sucede para algunos vainas heredadas o patentadas).
- Usted confía en los plugins CocoaPods (por ejemplo, para cheques de lint o generación de código).
Cuando utilizar el cartaje
- Valora la modularidad y desea evitar el "proyecto de proyectos de proyectos de proyectos".
- Su aplicación es grande, y necesita optimizar los tiempos de construcción por caché marcos preconstruidos.
- Migras al Administrador de Paquetes Swift y quieres una transición gradual sin romper las integraciones existentes.
- Trabaja en un equipo que prefiere mantener el proyecto Xcode inclinado y gestionar manualmente los ajustes de construcción.
Migración entre los administradores de dependencia
Cambiar de CocoaPods a Cartago o viceversa es posible pero requiere una cuidadosa planificación. Aquí están los pasos de alto nivel.
Migrando desde CocoaPods a Cartago
- Quitar el Podfile, Podfile.lock, y el espacio de trabajo.
- Eliminar las fases de construcción relacionadas con los Pods (por ejemplo, “Embed Pods Frameworks”).
- Crear un Cartucho y listar las mismas bibliotecas (segurando que apoyan el Carthage).
- Corre .
- Agregue manualmente cada marco de Cartaje/Build/iOS al proyecto Xcode.
- Actualizar todas las declaraciones de importación – bajo Cartago, importa marcos directamente (por ejemplo, ).
- Prueba exhaustivamente; las dependencias transitivas pueden ahora necesitar un vínculo explícito.
Migrando desde Cartago a CocoaPods
- Eliminar las fases de construcción relacionadas con el cartaje y las referencias de marco del proyecto Xcode.
- Eliminar el Cartucho y Cartfile.resolved.
- Corre para crear un Podfile.
- Agregue todas las dependencias con limitaciones de versión apropiadas.
- Corre y luego abre el nuevo espacio de trabajo.
- Comprobar las importaciones duplicadas – CocoaPods puede incrustar bibliotecas de manera diferente.
- Actualizar los ajustes de construcción si es necesario (por ejemplo, ).
Mejores prácticas para ambos administradores
Independientemente de cuál herramienta elija, siguiendo estas prácticas mantendrá su proyecto saludable.
- Archivos de bloqueo: Siempre compromete Podfile.lock o Cartfile.resolved al control de versiones. Esto asegura que cada miembro del equipo y servidor de CI use exactamente las mismas versiones.
- Versiones de pino cuidadosamente: Usa operadores optimistas (]) para permitir actualizaciones menores al bloquear cambios de ruptura importantes. Especifique versiones exactas sólo cuando necesite estabilidad absoluta.
- Actualizaciones de riun deliberadamente: No ejecutar o sin revisar los cambios de dependencias actualizadas. La versión de programación se encuentra con la planificación de la huella.
- Audit for Swift version compatibility: Algunas bibliotecas pueden no apoyar la versión Swift que usa tu proyecto. Comprueba que la sucursal o la etiqueta de la dependencia coincide con tu cadena de herramientas Swift.
- Remover dependencias no utilizadas: Revisa periódicamente su Cartucho o Perfil y elimina las bibliotecas que ya no se utilizan. Las dependencias orfanas se hinchan en la superficie binaria y aumentan el ataque.
- Consider SPM for new projects:] El Administrador de Paquetes Swift está ahora integrado en Xcode y apoyado por la mayoría de las bibliotecas principales. Si usted está empezando desde cero, SPM puede ser la opción más simple. Tanto CocoaPods como Carthage siguen siendo excelentes para gestionar grandes proyectos heredados o marcos privados.
Problemas comunes
CocoaPods: “No se encuentra el espía”
Esto significa que la biblioteca no ha sido empujada al tronco de CocoaPods o está usando un nombre incorrecto. Verifique el nombre de la cápsula en cococoapods.org. Si la biblioteca es privada, necesita especificar su fuente en su Podfile.
CocoaPods: Conflictos en dependencias transitivas
Ejecutar e inspeccionar la salida. Es posible que necesite añadir restricciones explícitas de la versión para las cápsulas transitivas. Utilizar y un nuevo puede restablecer el gráfico de dependencia.
Cartaje: “No hay tal módulo” al construir
A menudo esto sucede porque el marco no se construyó para la plataforma correcta (por ejemplo, usted construyó con ] por error). Re-run ] y verificar la carpeta de salida. También asegúrese de que añada el marco a la sección "Frameworks, Libraries y Contenido Embedded", no sólo el navegador del proyecto.
Carthage: Build falla debido a las dependencias desaparecidas
Si una biblioteca que está utilizando tiene sus propias dependencias (como las dependencias RxSwift), debe enumerarlas en su Cartucho. El cartaje no descarga automáticamente dependencias transitivas a menos que aparezcan en el Cartucho o se especifiquen como submódulos.
Enfoques híbridos: Utilizando tanto CocoaPods como Cartago
Aunque no se recomienda mezclar administradores de dependencia en un solo proyecto, algunos equipos lo hacen por necesidad. Por ejemplo, una biblioteca crítica sólo puede estar disponible a través de CocoaPods, mientras que el resto del proyecto utiliza Carthage. Si usted debe combinarlos, mantenga el espacio de trabajo CocoaPods separado y vincule los marcos de Cartago manualmente. Tenga en cuenta los posibles conflictos de los símbolos duplicados o superpone los recursos.
El futuro de la gestión de dependencia de iOS
El Administrador de Paquetes Swift (SPM) ahora es considerado como el estándar de Apple y se integra directamente en Xcode 11 y más tarde. La mayoría de las bibliotecas de código abierto han añadido soporte SPM, y SPM elimina la necesidad de herramientas externas. Sin embargo, tanto CocoaPods como Carthage todavía tienen ventajas:
- CocoaPods ofrece una rica personalización a través de ganchos y plugins, y su repositorio de espectro sigue siendo la mayor colección de bibliotecas iOS.
- Carthage le da control completo sobre el proceso de construcción y es más fácil de caché, lo que lo hace popular en los flujos de trabajo CI-heavy.
Muchos equipos utilizan SPM para nuevas dependencias manteniendo las integraciones heredadas con CocoaPods o Carthage. Con el tiempo, se espera que SPM se convierta en el defecto, pero por ahora, entender las tres herramientas le permite trabajar en cualquier base de código iOS.
Conclusión
La gestión eficaz de dependencia es una piedra angular del desarrollo profesional de iOS. CocoaPods ofrece una solución llave en mano que automatiza todo el proceso de integración, lo que lo hace ideal para equipos que quieren velocidad y simplicidad. Carthage ofrece un enfoque más flexible y transparente que da a los desarrolladores control granular sobre sistemas de construcción y estructura de proyecto. Al dominar ambas herramientas, puede elegir el ajuste adecuado para el tamaño, la complejidad y el flujo de trabajo de su proyecto siempre.
Para más lectura, explore las guías oficiales de CocoaPods ] y el repositorio de Carthage GitHub.