En esta presentación damos un repaso de lo que son dependencias, el uso de dependency managers y la ventajas que nos ofrecen. Revisamos en qué consisten los submódulos GIT, Cocoapods y Carthage, señalando sus ventajas/desventajas y como podemos incorporarlos en nuestros proyectos.
5. Frameworks proporcionan soluciones a problemas recurrentes.
Comunicación HTTP
Descarga asincrona de imágenes
Nuevas soluciones en base de datos
Animaciones
Nuevas formas de programación… etc
Frameworks de terceros cuentan con gran participación de la comunidad
Constante mantenimiento
Nuevas funcionalidades o libres de bugs
6. Gestores de dependencia (Dependency Managers)
Dependencia
“Módulo externo e independiente que puede ser tan pequeño como un simple archivo o
tan grande como una colección de directorios y/o archivos organizados en paquetes
para cumplir con una tarea especifica”
Facilitan la integración de librerías de terceros en nuestra aplicación (al igual que su
eliminación y actualización con nuevas versiones)
Provee mecanismos para agregar código adicional y por tanto nuevas funcionalidades
Coordinan la integración con librerías externas o paquetes a la aplicación
10. Asociarlos con
los targets
(link to binary)
Agregar linker
flagsImportarlos en
nuestro proyecto
Descargar
frameworks,
bundles…
…incorporar el framework manualmente?
….Si hay frameworks dependientes,
repetir el proceso
Es un proceso complejo, propenso a
errores …
11. No se cuenta una referencia original del código ( ¿ de dónde salió ? )
Actualizaciones no son fáciles de integrar
No se cuenta con información de las versiones
• Estamos usando versión 1.2.3? o 1.4.0?
• ¿Contamos con el fix de la versión XYZ?
Además…
13. Es una forma de administrar dependencias utilizando git
Crear dependencias
podemos hacer que nuestro proyecto Principal A dependa de proyecto B
(framework)
Submódulos Git
Requisito
Tanto el proyecto principal como el framework cuentan con control de versiones Git.
Al agregar un submódulo…
Se genera archivo de configuración oculto: .gitmodules
Se clona el proyecto del framework dentro de un directorio del proyecto principal
El proyecto principal guarda una referencia del commit que apunta el submódulo.
15. Ejemplo: Agregar framework Circle-Menu como submódulo Git
1.Dentro del directorio del proyecto principal, creamos un directorio para almacenar los frameworks
(submódulos).
16. Ejemplo: Agregar framework Circle-Menu como submódulo Git
2. Agregamos un submodulo con el siguiente comando:
<<URL>> : del repositorio remoto Circle-Menu
<<DIR_LOCAL>> : es el directorio local dentro de nuestro proyecto,
$git submodule add <<URL>> <<DIR_LOCAL>>
17. Ejemplo: Agregar framework Circle-Menu como submódulo Git
3. Dentro del directorio principal, se crea .gitmodules que almacena un mapeo entre la URL del
proyecto y el directorio local al que se descargó el submodulo.
Al igual que el archivo .gitignore, el archivo .gitmodules debe monitorearse en Git (subirse o
descargarse con el resto del proyecto).
[submodule "MainProject/Frameworks/Internal"]
path = MainProject/Frameworks/Internal
url = https://github.com/Ramotion/circle-menu.git
4. Para obtener un resumen de los submodulos (e.j. commits modificados) usamos:
$git config --global status.submoduleSummary true
18. Ejemplo: Agregar framework Circle-Menu como submódulo Git
5. Preparamos un commit agregando los cambios.
19. Ejemplo: Agregar framework Circle-Menu como submódulo Git
6. Con el Finder, dentro de Frameworks/Internal… ubicamos el proyecto de CircleMenu.xcodeproj y lo
arrastramos al Xcode con nuestro proyecto principal abierto.
20. Ejemplo: Agregar framework Circle-Menu como submódulo Git
7. Seleccionamos el proyecto principal > target MainProject
8. En la pestaña General en Linked Frameworks
agregamos el CircleMenu.framework.
21. Ejemplo: Agregar framework Circle-Menu como submódulo Git
9. Preparamos el commit e integramos la librería en nuestro ViewController
24. 1. Dentro del proyecto del submódulo, hacemos checkout a otro commit o rama
GESTIONANDO CAMBIOS DEL SUBMÓDULO
25. 3. En el proyecto principal cambia la referencia del submódulo.
GESTIONANDO CAMBIOS DEL SUBMÓDULO
26. 3. En el proyecto principal cambia la referencia del submódulo.
GESTIONANDO CAMBIOS DEL SUBMÓDULO
27. Comandos adicionales
Comando Descripción
$git submodule sync Actualiza la metadata de los submódulos cuando la URL cambió
$git submodule update Actualiza los contenidos de los submódulos. Equivalente a correr ”git
fetch” y “git checkout” en cada submódulo
$git rm PATH_SUBMOD. Se remueve del repositorio local y filesystem
29. Dependency manager hecho en Ruby
Instalación de la herramienta
Además de proponer la distribución de librerias de terceros permite su integración
automática
Facilmente instalable con el Ruby disponible en el OS X
$sudo gem install cocoapods
Surgió en Agosto – Septiembre del 2011
Cuenta con alrededor de 47 000 librerias y es usado en 3 millones de apps
30. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
Pods GitHubServices
Podfile Podfile.lock
31. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
1.Creamos un Cocoa Touch framework llamado GitHubServices
2. En terminal, dentro del proyecto, ingresamos el comando para generar un archivo de configuración
Podfile
$pod init
32. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
3. Llenamos el Podfile con las dependencias que deseamos (indicando la versión , branches o
commits)
33. Semantic Versioning
1.4.7
Patch ó fixes^
Minor release
Nuevo feature^
Mayor
release*
• * - Rompe backwards compatibility
• ^ - Sin romper backward compatibility
= >= < <= ~>
Operadores Soportados
35. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
4. Para instalar las librerías ingresamos el siguiente comando:
$pod install
36. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
5. Cocoapods genera un xcworkspace (una colección de proyectos)
37. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
6. Justo como cualquier otro framework, lo importamos en nuestra clase solicitada.
38. Ejemplo: Crear una librería (Cocoa Touch framework) que se comunique al API de GitHub para realizar
una búsqueda de usuarios.
7. Probando el framework con clase XCTestCase
39. Más conceptos sobre Cocoapods…
Podfile.lock Guarda ”snapshot” de las versiones de las dependencias.
Es decir, mantiene/rastrea la versión de cada
dependencia.
Podspec Archivo creado por el autor de la librería, indica
prerequisitos como librerías, assets, URLs de
repositorios..etc
$pod update Comando para instalar nuevas versiones de librerias o
dependencias
40. Un vistazo a Podfile.lock
Podfile
‘Libreria’ : 1.3.3
pod ‘Libreria’ ~> 1.3
Si n un Podfile.lock puede
exi sti r una desi ncroni zaci ón
de l as versi ones de
dependenci as.
44. Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
pod install
Instalado : 1.4.0
Un vistazo a Podfile.lock
pod ‘Libreria’ ~> 1.3
45. Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3 Instalado : 1.4.0
Un vistazo a Podfile.lock
pod ‘Libreria’ ~> 1.3
“Pueden exi sti r conflictos con las dependenci as al
manej ar di ferentes versiones.”
46. Podfile.lock Podfile.lock
Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
Librería: 1.3.3 Librería: 1.3.3
Un vistazo a Podfile.lock
Al exi sti r un archi vo
Podfile.lock, se da un
segui mi ento a l as versi ones
48. Podfile.lock Podfile.lock
Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
Librería: 1.3.3 Librería: 1.3.3
pod install
Instalado : 1.3.3
Un vistazo a Podfile.lock
Aunque ejecuta pod install
la version que se instala
no es la 1.4.0, sino la 1.3.3
51. Carthage genera binarios de los frameworks y el desarrollador los integra
a su proyecto
2 formas de instalación :
Para consultar la versión de Carthage
A diferencia de Cocoapods, Carthage no ”altera” la estructura del proyecto
No requiere de Podspecs o repositorio centralizado para el desarrollo de
dependencias.
Instalador .pkg
Homebrew package manager (Homebrew ayuda a instalar herramientas para Mac OS)
$carthage version
52. Archivo de configuración donde indicamos qué dependencias / librerias deseamos
instalar
* Otros elementos opcionales: nombre de rama/ nombre del tag / commit
Consiste de:
github "Alamofire/Alamofire" == 45
Cartfile
Ejemplo:
Origen Nombre Versión (opcional)
Origen de la dependencia puede ser:
Github
Git (la palabra git seguido de git://, http://, ssh:// o path local)
53. Ejemplo: Integrar Lottie, una librería que parsea animaciones con Adobe After Effects en formato json
para renderizarlos en pantalla.
54. Ejemplo: Integrando Lottie con Carthage
1. Definimos nuestro Cartfile de la siguiente manera:
2. En terminal ingresamos el siguiente comando para la descarga y generación de frameworks por cada
dependencia:
$carthage update
55. Ejemplo: Integrando Lottie con Carthage
3. A diferencia de Cocoapods, Carthage NO genera un xcworkspace para que podamos trabajar, sino que crea:
Archivo que indica las versiones
de nuestras dependencias.
Ideal subirlo a control de
versiones
Contiene los frameworks
construidos por Carthage que
se integrarán manualmente al
proyecto.Directorio para verificar el
código fuente de cada
dependencia. Su contenido
puede sobreescribirse.
56. Ejemplo: Integrando Lottie con Carthage
4. Del directorio Carthage>Build>iOS arrastramos el Lottie.framework a la sección de Linked Frameworks and
Libraries.
57. Ejemplo: Integrando Lottie con Carthage
5. Ahora bien, necesitamos asegurarnos que los frameworks se copien con un Run Script.
• Se selecciona el target y la pestaña
Build Phases
• En la esquina superor izquierda se
presiona “+” para agregar new Run
Script
• Se ingresa el siguiente script
• Para input files
$(SRCROOT)/Carthage/Build/iOS
/Lottie.framework
/usr/local/bin/carthage
copy-frameworks
58. Ejemplo: Integrando Lottie con Carthage
6. Como paso final, queda incorporar nuestra librería dentro del View Controller adecuado.
60. Carthage
El control de versiones debe
dar seguimiento (track) al
archivo como .gitmodules
El proyecto principal guarda
una referencia al commit del
submódulo.
Asegurarse que esa referencia
se suba al repositorio del
proyecto para el resto del
equipo.
Submódulos Git
Se cuentan con 2 opciones:
- Recrear el ambiente
* Subir al repositorio
remoto Podfile.lock y Podfile
* Ejecutar pod install y
bajar las dependencias
correspondientes.
- Subir al control de
versiones nuestros pods
Cocoapods
Buenas prácticas
Se cuentan con 2 opciones:
- Recrear el ambiente
* Subir al repositorio
remoto Cartfile.resolved y
Cartfile
* Ejecutar carthage
bootstrap y bajar las
dependencias
correspondientes.
61. Submódulos Cocoapods Carthage
Requisitos de instalación -
$sudo gem install cocoapods
Homebrew
Instalador .pkg
Proceso de configuración
Clonar repositorio
Incorporar manualmente el framework
Generar archivo de configuración (pod
init)
Instalar las dependencias (pod install)
Trabajar en nueva estructura de
proyecto
Generar archivo de configuración
Instalar dependencias (carthage
update)
Incorporar manualmente los
frameworks
Modifica la estructura del proyecto No Sí No
Archivo de especificación - Podspecs -
Archivo de configuración .gitmodules Podfile Cartfile
Archivo con versiones - Podfile.lock Cartfile.resolved
Modo de actualizar frameworks a
últimas versiones
mediante Git (checkout, pull)
Actualizando Podfile
Ingresar en linea de comando - pod
update
Actualizando Cartfile
Ingresar en linea de comando -
carthage update --platform iOS
Ventajas
Fácil de instalar si contamos con
buenas bases en GIT
Fácil de instalar
Se tiene la opción de recrear el
ambiente ó trabajar con los mismos
pods
Fácil de instalar
Flexible, indicamos diferentes origenes
de las dependencias
Se tiene la opción de recrear el
ambiente ó trabajar con los mismos
binarios
Desventajas
Complejo de gestionar
No contamos con un archivo con las
versiones (Podfile.lock y
Cartfile.resolved)
Mantenimiento del Podspec
Falta mayor flexibilidad al indicar los
origenes de dependencias.
Asegurarse de incorporar los
frameworks manualmente tras instalar
o actualizar
63. Más información
• What are Dependency Managers?
https://medium.com/prodsters/what-are-dependency-managers-26d7d907deb8
• An Introduction to CocoaPods (Route 85)
https://www.youtube.com/watch?v=iEAjvNRdZa0
• CocoaPods and Lockfiles (Route 85)
https://www.youtube.com/watch?v=H-
zK1mEwTe0&index=12&t=0s&list=PLOU2XLYxmsIKGQekfmV0Qk52qLG5LU2jO
• Carthage
https://github.com/Carthage/Carthage#license
• Cómo crear, instalar y utilizar un CocoaPod con storyboards y VCs.
https://medium.com/@angelmoralesk/c%C3%B3mo-crear-instalar-y-utilizar-un-
cocoapod-con-sus-storyboards-y-vcs-e0b791a6e087
64. Más información
• Dependency Management Using Git Submodules
https://www.raywenderlich.com/155150/dependency-management-using-git-
submodules
• Circle Menu
https://github.com/Ramotion/circle-
menu?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more
• Lottie
https://github.com/airbnb/lottie-ios