CocoaPods es un gestor de dependencias a nivel de aplicación para nuestros proyectos de Xcode. Estas dependencias son librerías en las que nuestra aplicación se apoya para dar soporte a ciertas funcionalidades y que mediante CocoaPods podemos añadir tanto a estas como también a las dependencias de nuestras librerías, eliminarlas o mantenerlas actualizadas en nuestro proyecto de una manera relativamente sencilla.

En este Tutorial CocoaPods vamos a asumir que el lector sabe cómo instalar y configurar nuestro entorno de desarrollo en macOS.

Las dependencias de nuestro proyecto son especificadas en un archivo de texto llamado Podfile. Luego de este paso CocoaPods resolverá las dependencias entre las librerías / frameworks, descargará los respectivos códigos fuentes para enlazarlos entre si dentro del espacio de trabajo de un proyecto de Xcode quedando listo para compilar.

Instalar y Actualizar CocoaPods

Comencemos por decir que CocoaPods ha sido construido con Ruby y su instalación la llevamos a cabo mediante la instalación de Ruby que viene por defecto en macOS y apoyándonos siempre en sudo para obtener los permisos necesarios a la hora de instalar las gemas. Dicho esto y luego de abrir la consola el primer comando a ejecutar es:

…al presionar Enter nos pedirá el password asociado a nuestro usuario y proseguirá con la instalación de CocoaPods y sus dependencias, finalizado este proceso ya todo estará listo.

Para actualizar CocoaPods solamente tenemos que hacer algo tan sencillo como ejecutar el comando anterior, sí, lo volvemos a instalar y esto actualiza la versión local con la última disponible.

Usar CocoaPods en un Proyecto Xcode

Imaginemos que vamos a crear un proyecto de Xcode el cual hará uso de Realm como gestor de bases de datos. Entre las opciones de instalación con las que contamos, por razones evidentes, elegiremos aquella a través de CocoaPods. Luego de crear el proyecto en Xcode y salvarlo, cerramos Xcode y nos vamos a la carpeta donde se encuentra el proyecto. En la raíz del mismo, donde encontramos el archivo <nombreProyecto>.xcodeproj, crearemos un fichero nuevo de nombre Podfile o nos vamos a la terminal y ejecutamos:

…esta última opción nos crea el Podfile con una configuración básica inicial. Sea cualquiera de estas dos opciones la que elijamos el contenido final será:

En este archivo quisiera destacar la línea 4 donde especificamos la versión de RealmSwift (el pod asociado con este framework) que usaremos, también en esta línea tenemos el “operador optimista” (como los chicos de CocoaPods le llaman) que cuando lo usamos en este campo puede adoptar las siguientes formas:

ModoDescripción
~> 0.1.2La versión 0.1.2 y hasta la 0.2, sin incluir la versión 0.2 o cualquier otra superior.
~> 0.1La versión 0.1 hasta la 1.0, sin incluir la versión 1.0 o cualquier otra superior.
~> 0 La versión 0 o cualquiera superior.
1.5La versión 1.5 y ninguna otra.

La otra línea sería la número 10 donde hacemos referencia a la versión del lenguaje Swift.

Salvamos el archivo y nos vamos a la terminal, nos cambiamos a la dirección de nuestro proyecto y en la raíz del mismo (donde acabamos de crear el Podfile) ejecutamos el comando:

Luego de esta acción ya tenemos Realm instalado al igual que sus dependencias. En nuestro proyecto ahora tendremos una carpeta de nombre Pods con varias subcarpetas donde se encuentra el material (librerías / frameworks) descargado, un archivo de nombre RealmTest.xcworkspace (en mi caso) el cual ejecutaremos a partir de ahora para abrir nuestro proyecto y por último un archivo Podfile.lock donde se encuentran todos los pods instalados como dependencia y sus respectivas versiones, en mi caso luce así:

…este archivo es bloqueado por CocoaPods (de ahí el .lock) en pos de proteger el ecosistema creado para nuestro proyecto y de hecho tampoco se actualiza incluso aunque ejecutemos nuevamente pod install.

Nota: Más adelante veremos como actualizar las dependencias.

En este punto ya podemos abrir nuevamente nuestro proyecto pero en esta ocasión a través del archivo ejecutable <nombreProyecto>.xcworkspace y tener en cuenta que donde vayamos a hacer uso de la librería que hemos instalado pues agregamos la respectiva cabecera, en mi caso sería:

Lo más probable es que antes de la primera compilación (Build) tengamos algunos errores, pero estos deben solucionarse al compilar. Esto sería todo a grandes rasgos, a partir de aquí podemos continuar desarrollando nuestra aplicación macOS o iOS haciendo uso de la librería que hemos instalado con CocoaPods.

Diferencias entre Instalar o Actualizar un Pod

Es bastante frecuente entre las personas que comienzan ha usar CocoaPods, pensar que pod install solamente se usa la primera vez que configuramos nuestro proyecto y agregamos el Podfile y que a partir de este punto solamente se usa pod update. Esto no es así:

pod install

Se usa al inicio, en ese momento donde instalamos las librerías en nuestro proyecto, pero también cada vez que modificamos el Podfile para añadir, actualizar o eliminar un pod.

pod update

Ante este comando CocoaPods intentará encontrar una versión más moderna de los pod instalados, sin tomar en cuenta aquellos listados en Podfile.lock. El pod será actualizado siempre y cuando se mantenga la restricción de versiones (‘MyPod’, ‘~>x.y’) establecido en el Podfile.

pod outdated

Cuando ejecutamos este comando, CocoaPods listará todos los pods que tienen versiones más modernas que aquellas listadas en el archivo Podfile.lock.

Escenario de Ejemplo

Veamos un posible escenario de uso como ejemplo y a modo de resumen de lo antes expuesto. Este ejercicio ha sido publicado en la documentación oficial de CocoaPods y me ha gustado mucho, así que he decidido compartirlo con vosotros. Es el siguiente:

Imaginemos que tenemos un proyecto en el cual queremos hacer uso de los pod A, B y C. Los agregamos al Podfile donde también especificamos que los tres se encuentran en su versión 1.0.0, por último ejecutamos pod install. Este comando instalará los pod A, B y C y creará el Podfile.lock donde se llevará un registro de estos y sus versiones.

Luego de esto necesitamos hacer uso de otra librería por lo que necesitamos instalar el pod D. Lo añadimos al Podfile y ejecutamos nuevamente pod install. En este punto el pod A ya se encuentra en su versión 1.1.0 pero esto CocoaPods lo ignora por defecto en pos de la seguridad, de esta manera protege la configuración que hemos elegido al especificar que estos pods los queríamos en su versión 1.0.0 y sin un análisis previo por nuestra parte la versión 1.1.0 del pod A puede generar errores inesperados. Por esto CocoaPods se enfoca en el nuevo pod D que acabamos de añadir en el Podfile, lo instala y lo agrega también al Podfile.lock.

En este momento se nos une un colaborador, no ha trabajado anteriormente el el proyecto y como tal clona el repositorio en su ordenador y luego usa pod install. El contenido de Podfile.lock (que también fue clonado) nos garantiza que esta persona trabajará también con las versiones 1.0.0 que hemos añadido al inicio.

Ahora nos hemos enterado que ha salido también la versión 1.2.0 del pod B donde se agregan varias correcciones de errores, optimizaciones y características nuevas que serían genial poder hacer uso de ellas en nuestra aplicación. Para esto ejecutamos el comando pod outdated donde se nos confirma las versiones nuevas disponibles. Pero aún no queremos actualizar el pod A así que ejecutamos pod update B para actualizar solamente B, se descarga la nueva versión, se actualiza y por último se modifica el fichero Podfile.lock donde ahora se hace referencia a la versión 1.2.0 de B.

Ha quedado bastante claro, verdad?

Esto no es todo sobre CocoaPods, en un futuro no muy lejano veremos acciones más avanzadas.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

Cualquier sugerencia, ya sea errores a corregir, información o ejemplos a añadir será, más que bienvenida, necesaria!