¿Qué es Carthage y cómo puede optimizar el desarrollo de apps?

Carthage es un gestor de dependencias para proyectos de iOS y macOS que permite a los desarrolladores integrar bibliotecas de terceros en sus aplicaciones de forma sencilla y eficiente. A diferencia de otras herramientas como CocoaPods, Carthage apuesta por ser minimalista y no invasivo, lo que significa que no modifica la estructura del proyecto y solo requiere un sencillo archivo de texto, un Cartfile, con la lista de dependencias. Esto lo ha convertido en una opción popular entre los desarrolladores que desean mantener el control de la configuración de su proyecto y, al mismo tiempo, aprovechar bibliotecas y frameworks de terceros.

Carthage funciona compilando frameworks binarios, que después pueden integrarse directamente en los proyectos de Xcode. Este enfoque permite a los desarrolladores beneficiarse de tiempos de compilación más rápidos y de un proceso de desarrollo más ágil. Con Carthage, las dependencias pueden añadirse, actualizarse y gestionarse fácilmente sin archivos de configuración complejos ni cambios no deseados en el proyecto. A cambio, los frameworks compilados se añaden a Xcode manualmente. Esto hace de Carthage una buena herramienta para quienes buscan una solución de gestión de dependencias sencilla pero potente en sus proyectos de desarrollo para iOS y macOS.

Carthage es un gestor de dependencias descentralizado para proyectos de iOS y macOS. Obtiene y compila bibliotecas de terceros como frameworks, que después el propio desarrollador añade a su proyecto de Xcode, sin que el archivo del proyecto se modifique automáticamente. Esto ofrece un control total sobre la estructura del proyecto y puede proporcionar tiempos de compilación más rápidos, porque las dependencias solo se compilan cuando se actualizan. Carthage se utiliza principalmente como una alternativa más sencilla a CocoaPods, mientras que Swift Package Manager es la solución integrada de Apple para la gestión de paquetes.

Más sobre Carthage

Carthage es un gestor de dependencias para iOS y macOS que ofrece una forma sencilla y flexible de integrar bibliotecas de terceros en los proyectos. A diferencia de otras herramientas que modifican automáticamente la configuración del proyecto, Carthage se centra en una configuración mínima y da a los desarrolladores libertad para gestionar sus proyectos sin restricciones innecesarias.

Técnicamente, Carthage funciona compilando frameworks binarios a partir del código fuente, o descargando otros ya compilados, lo que permite a los desarrolladores incluir estos frameworks directamente en sus proyectos de Xcode. Esto significa que Carthage no modifica los archivos del proyecto, sino que genera una carpeta «Carthage/Build» en la que se almacenan los frameworks compilados. Este enfoque da a los desarrolladores un control total sobre la estructura y las dependencias de su proyecto.

Carthage admite tres funciones principales, cada una de las cuales ofrece una forma distinta de gestionar las dependencias:

  1. Compilación de dependencias: Carthage puede compilar automáticamente todas las dependencias especificadas en un «Cartfile». Esto permite a los desarrolladores centrarse en su propio código mientras Carthage se encarga de compilar las bibliotecas externas. Esta función es ideal para proyectos que requieren varias bibliotecas de terceros.

  2. Actualización de dependencias: Con un único comando, Carthage puede actualizar todas las dependencias a las versiones más recientes que cumplan los requisitos de versión del Cartfile. Esto facilita mantener las bibliotecas actualizadas, incluidas las correcciones de seguridad, algo importante para mantener la compatibilidad y la seguridad.

  3. Integración de frameworks: Carthage genera frameworks que el propio desarrollador añade al proyecto de Xcode, normalmente en «Frameworks, Libraries, and Embedded Content». Esto requiere un paso manual, pero ofrece una visión completa de qué bibliotecas forman parte exactamente del proyecto y facilita aprovechar las nuevas funciones y mejoras de las bibliotecas de terceros.

Uno de los mayores puntos fuertes de Carthage es su sencillez y flexibilidad. Al evitar cambios automatizados en el proyecto, Carthage permite a los desarrolladores mantener el control de sus proyectos. Esto reduce el riesgo de conflictos en el archivo del proyecto y facilita integrar nuevas dependencias sin alterar las estructuras de proyecto existentes.

El enfoque de Carthage para la gestión de dependencias también ahorra tiempo en el trabajo diario. Al compilar las dependencias solo cuando se añaden o actualizan, y al evitar cambios innecesarios en el proyecto, Carthage minimiza el tiempo y los recursos necesarios para mantener un proyecto. Esto lo convierte en una buena herramienta para los desarrolladores que desean optimizar sus flujos de trabajo y centrarse en entregar software de alta calidad.

En la práctica, Carthage ha tenido un impacto significativo en la forma en que los desarrolladores gestionan las dependencias en los proyectos de iOS y macOS. Lo han utilizado equipos de desarrollo tanto pequeños como grandes para mantener sus proyectos actualizados, seguros y fáciles de mantener. Hoy en día, sin embargo, el desarrollo de Carthage se ha ralentizado considerablemente y la mayoría de las bibliotecas se orientan ahora en primer lugar a Swift Package Manager.

En resumen, Carthage es una herramienta que combina sencillez, flexibilidad y eficiencia en una solución que hace la gestión de dependencias más transparente tanto para desarrolladores individuales como para equipos grandes. Su configuración sencilla y su mínima intervención en la estructura del proyecto lo han convertido en una herramienta útil en el desarrollo de apps, donde son necesarias integraciones rápidas y seguras.

Preguntas frecuentes sobre Carthage

¿Qué es Carthage y cómo funciona en la práctica?

Carthage es un gestor de dependencias descentralizado para proyectos de iOS, macOS, tvOS y watchOS escritos en Swift y Objective-C. No existe un registro central de paquetes. En su lugar, cada dependencia apunta directamente a un repositorio Git, normalmente en GitHub.

Las dependencias se especifican en un archivo de texto llamado Cartfile en la carpeta raíz del proyecto. Cuando se ejecuta el comando carthage update, Carthage busca versiones adecuadas, descarga el código fuente en la carpeta Carthage/Checkouts y compila cada biblioteca con las herramientas de compilación propias de Xcode. Los frameworks terminados se colocan en Carthage/Build.

Carthage no modifica el archivo del proyecto de Xcode. El desarrollador añade los frameworks compilados en Frameworks, Libraries, and Embedded Content del target correspondiente. Esto ofrece un control total sobre la configuración del proyecto, pero requiere algo más de trabajo manual que las herramientas que integran automáticamente.

¿Cómo se instala Carthage y cómo se añade una biblioteca?

Carthage suele instalarse con Homebrew mediante el comando brew install carthage. Como alternativa, puede descargarse un paquete de instalación desde las releases del proyecto en GitHub.

Una biblioteca suele añadirse en cuatro pasos:

  • Se crea el archivo Cartfile en la carpeta raíz del proyecto con una línea como github "Alamofire/Alamofire" ~> 5.0.
  • El comando carthage update --use-xcframeworks --platform iOS obtiene y compila la biblioteca.
  • El .xcframework terminado de Carthage/Build se arrastra a Frameworks, Libraries, and Embedded Content en el target de la app.
  • Para los frameworks dinámicos, se selecciona Embed & Sign.

El operador ~> significa que se aceptan versiones más recientes siempre que la versión mayor siga siendo la misma. A continuación, la biblioteca puede utilizarse en el código con import Alamofire.

¿Cuál es la diferencia entre Cartfile y Cartfile.resolved?

Cartfile describe qué dependencias necesita el proyecto y qué requisitos de versión deben cumplir, p. ej., ~> 5.0, >= 2.1 o una rama concreta. El archivo se edita manualmente y expresa la intención.

Cartfile.resolved se genera automáticamente y contiene las versiones o los commits exactos que se eligieron realmente, también para las dependencias de las propias dependencias. El archivo actúa como un bloqueo, de modo que todos los miembros de un equipo y todos los servidores de compilación obtienen exactamente el mismo código.

La diferencia se aprecia en los comandos:

  • carthage update busca las versiones más recientes que coinciden con Cartfile y escribe el resultado en Cartfile.resolved.
  • carthage bootstrap obtiene y compila exactamente las versiones indicadas en Cartfile.resolved.

Por tanto, ambos archivos deben mantenerse en el control de versiones. Las dependencias que solo se utilizan durante el desarrollo, como las bibliotecas de pruebas, pueden colocarse en Cartfile.private.

¿Cómo compila Carthage los XCFrameworks y por qué es importante?

Antes, Carthage compilaba los llamados fat frameworks, en los que el código para dispositivos físicos y para el simulador se combinaba en un único archivo con la herramienta lipo. Esto dejó de funcionar con Xcode 12, porque tanto los dispositivos como los simuladores en Apple Silicon utilizan la arquitectura arm64, y la misma arquitectura no puede aparecer dos veces en un fat framework.

La solución son los XCFrameworks, que Apple introdujo con Xcode 11. Un XCFramework es un paquete con un binario independiente para cada plataforma y variante, como dispositivo iOS y simulador de iOS. A partir de Carthage 0.37, los XCFrameworks se compilan con la opción --use-xcframeworks, p. ej., carthage bootstrap --use-xcframeworks.

El resultado se coloca como carpetas .xcframework en Carthage/Build. Se añaden directamente al target de la app y la antigua fase de compilación con carthage copy-frameworks ya no es necesaria.

¿Cuál es la diferencia entre Carthage, CocoaPods y Swift Package Manager?

Las tres herramientas resuelven la misma tarea, pero de formas distintas:

  • Carthage es descentralizado y obtiene las dependencias directamente de los repositorios Git especificados en un Cartfile. Las bibliotecas se compilan como frameworks binarios y el proyecto de Xcode no se modifica. La integración se hace manualmente.
  • CocoaPods utiliza un registro central de bibliotecas y un Podfile. El comando pod install crea un workspace y modifica la configuración del proyecto, por lo que la integración es automática, pero menos transparente. CocoaPods se encuentra ahora en modo de mantenimiento.
  • Swift Package Manager (SPM) es la herramienta propia de Apple y está integrada en Xcode. Los paquetes se añaden directamente en Xcode o se describen en un Package.swift, y no se requiere ninguna instalación adicional.

Carthage resulta útil cuando se desea un control total sobre el archivo del proyecto y tiempos de compilación más cortos, porque las dependencias solo se compilan cuando se actualizan. Para los proyectos nuevos, SPM es ahora la opción más utilizada, ya que la mayoría de las bibliotecas lo admiten.

¿Cómo pueden reducirse los tiempos de compilación con Carthage?

Como Carthage compila por defecto las dependencias a partir del código fuente, la primera compilación puede tardar mucho. Varias opciones permiten reducir el tiempo:

  • --platform iOS limita la compilación a las plataformas que el proyecto utiliza realmente.
  • --cache-builds omite las dependencias que ya se han compilado en la misma versión, de modo que solo se vuelven a compilar las bibliotecas modificadas.
  • Las dependencias pueden actualizarse por separado, p. ej., con carthage update Alamofire, en lugar de actualizarlas todas.
  • Muchas bibliotecas ofrecen frameworks precompilados en sus releases de GitHub, que Carthage descarga automáticamente. Los SDK de código cerrado pueden especificarse con binary y una URL a una especificación JSON.

En los servidores de compilación, la carpeta Carthage/Build también puede almacenarse en caché entre ejecuciones. Muchos equipos mantienen la carpeta fuera de Git mediante .gitignore y la vuelven a crear con carthage bootstrap.

Carthage para dummies

Carthage es una herramienta que ayuda a organizar y gestionar las pequeñas piezas de las que están hechas las apps, llamadas «dependencias». Imagina que estás creando una app que necesita algunas piezas ya hechas que otros han creado para que funcione mejor. Carthage te ayuda a obtener estas piezas y a llevar el control de ellas, para que no tengas que hacerlas desde cero. Funciona un poco como un bibliotecario que lleva el control de todos los libros necesarios para un proyecto, para que el escritor pueda centrarse en su propia historia. Hace que desarrollar apps sea más fácil y rápido, porque se puede reutilizar el trabajo de otras personas y asegurarse de que todo encaja.

Deja un comentario