SlideShare une entreprise Scribd logo
1  sur  64
Télécharger pour lire hors ligne
Dependency Managers
S u b m ó d u l o s G I T
C o c o a p o d s
C a r t h a g e
Soy Angel Morales
iOS Developer @ Deloitte Digital
¡ Hola !
http://medium.com/@angelmoralesk
https://github.com/ctime95
Agenda
¿Qué son los dependency managers?
Submódulos Git
Carthage
Dependencias
Ventajas
¿Por qué no conviene gestionar dependencias manualmente?
Cocoapods
Conceptos
Ejemplo : Agregar framework como submódulo Git
Conceptos
Ejemplo: Integrar Lottie con Carthage
Conclusiones
Conceptos
Ejemplo: Integrar Cocoapods en una librería Cocoa Touch
Gestionando cambios
Comandos adicionales
Semantic Versioning
Un vistazo a Lockfiles
Dependency
Managers
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
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
Dependency Managers no
es exclusivo en iOS
Código
reutilizable
Agilizamos
desarrollo
Manejo de
versiones
Ventajas
¿Por qué Dependency
Managers si podemos…?
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 …
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…
Submódulos
Git
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.
Ejemplo: Agregar framework Circle-Menu como submódulo Git
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).
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>>
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
Ejemplo: Agregar framework Circle-Menu como submódulo Git
5. Preparamos un commit agregando los cambios.
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.
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.
Ejemplo: Agregar framework Circle-Menu como submódulo Git
9. Preparamos el commit e integramos la librería en nuestro ViewController
Repositorio
MainProject
Repositorio
Circle - menu
MainProject
Circle - menu
Último commit
36abcz
ViewController.swift
Modelo.swift
Commit submodulo 36abcz
GESTIONANDO CAMBIOS DEL SUBMÓDULO
Proyecto
Submódulos
Terminal
GESTIONANDO CAMBIOS DEL SUBMÓDULO
1. Dentro del proyecto del submódulo, hacemos checkout a otro commit o rama
GESTIONANDO CAMBIOS DEL SUBMÓDULO
3. En el proyecto principal cambia la referencia del submódulo.
GESTIONANDO CAMBIOS DEL SUBMÓDULO
3. En el proyecto principal cambia la referencia del submódulo.
GESTIONANDO CAMBIOS DEL SUBMÓDULO
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
Cocoapods
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
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
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
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)
Semantic Versioning
1.4.7
Patch ó fixes^
Minor release
Nuevo feature^
Mayor
release*
• * - Rompe backwards compatibility
• ^ - Sin romper backward compatibility
= >= < <= ~>
Operadores Soportados
Semantic Versioning
~> 1.4.7Ejemplos:
Ok, actualizar este
númeroActualizar el último
número de versión
1.4.8
1.4.9
1.4.10
~> 3.3 3.3.5
3.4.0
3.7.0
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
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)
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.
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
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
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.
Podfile
‘Libreria’ : 1.3.3
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
pod install
Un vistazo a Podfile.lock
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
Un vistazo a Podfile.lock
Podfile
Podfile
‘Libreria’ : 1.4.0
pod ‘Libreria’ ~> 1.3
Instalado : 1.3.3
Un vistazo a Podfile.lock
pod ‘Libreria’ ~> 1.3
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
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.”
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
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
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
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.4.0
pod update
Instalado : 1.4.0
Pero al usar
”pod update…”
Un vistazo a Podfile.lock
Carthage
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
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)
Ejemplo: Integrar Lottie, una librería que parsea animaciones con Adobe After Effects en formato json
para renderizarlos en pantalla.
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
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.
Ejemplo: Integrando Lottie con Carthage
4. Del directorio Carthage>Build>iOS arrastramos el Lottie.framework a la sección de Linked Frameworks and
Libraries.
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
Ejemplo: Integrando Lottie con Carthage
6. Como paso final, queda incorporar nuestra librería dentro del View Controller adecuado.
Conclusiones
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.
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
¡Gracias!
http://medium.com/@angelmoralesk
https://github.com/ctime95
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
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

Contenu connexe

Tendances

Git: un enfoque práctico
Git: un enfoque prácticoGit: un enfoque práctico
Git: un enfoque prácticoPatxi Gortázar
 
Git para-principiantes
Git para-principiantesGit para-principiantes
Git para-principiantesnscoder_mad
 
Gestión del software con Maven y Jenkins
Gestión del software con Maven y JenkinsGestión del software con Maven y Jenkins
Gestión del software con Maven y JenkinsBEEVA_es
 
PPT Git GitHub
PPT Git GitHubPPT Git GitHub
PPT Git GitHubdrsevilla
 
Uso de git (Cursos de e-ghost 2011)
Uso de git (Cursos de e-ghost 2011)Uso de git (Cursos de e-ghost 2011)
Uso de git (Cursos de e-ghost 2011)Iñaki Arenaza
 
El git nuestro de cada dia
El git nuestro de cada diaEl git nuestro de cada dia
El git nuestro de cada diaAlan Descoins
 
Desplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y JenkinsDesplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y JenkinsLa Drupalera
 
Introducción a Git
Introducción a GitIntroducción a Git
Introducción a GitSergio Rus
 
WorkShop: Introducción a GIT
WorkShop: Introducción a GITWorkShop: Introducción a GIT
WorkShop: Introducción a GITKeopx
 
Introducción al uso Git y GitHub para trabajo colaborativo
Introducción al uso Git y GitHub para trabajo colaborativoIntroducción al uso Git y GitHub para trabajo colaborativo
Introducción al uso Git y GitHub para trabajo colaborativoJuan J. Merelo
 
Mini-tutorial de git
Mini-tutorial de gitMini-tutorial de git
Mini-tutorial de gitAntonio Ognio
 
Introducción a git
Introducción a gitIntroducción a git
Introducción a gitKeopx
 
Git with Scrum en español
Git with Scrum en españolGit with Scrum en español
Git with Scrum en españolRamón Glez
 

Tendances (20)

Git: un enfoque práctico
Git: un enfoque prácticoGit: un enfoque práctico
Git: un enfoque práctico
 
Git / Guía Básica
Git / Guía BásicaGit / Guía Básica
Git / Guía Básica
 
Control de versiones con Git
Control de versiones con GitControl de versiones con Git
Control de versiones con Git
 
Git para-principiantes
Git para-principiantesGit para-principiantes
Git para-principiantes
 
Introducción a GIT
Introducción a GITIntroducción a GIT
Introducción a GIT
 
Gestión del software con Maven y Jenkins
Gestión del software con Maven y JenkinsGestión del software con Maven y Jenkins
Gestión del software con Maven y Jenkins
 
PPT Git GitHub
PPT Git GitHubPPT Git GitHub
PPT Git GitHub
 
Uso de git (Cursos de e-ghost 2011)
Uso de git (Cursos de e-ghost 2011)Uso de git (Cursos de e-ghost 2011)
Uso de git (Cursos de e-ghost 2011)
 
El git nuestro de cada dia
El git nuestro de cada diaEl git nuestro de cada dia
El git nuestro de cada dia
 
Desplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y JenkinsDesplegando código con Phing, PHPunit, Coder y Jenkins
Desplegando código con Phing, PHPunit, Coder y Jenkins
 
Migrando CI a Docker
Migrando CI a DockerMigrando CI a Docker
Migrando CI a Docker
 
Introducción a Git
Introducción a GitIntroducción a Git
Introducción a Git
 
WorkShop: Introducción a GIT
WorkShop: Introducción a GITWorkShop: Introducción a GIT
WorkShop: Introducción a GIT
 
Introducción al uso Git y GitHub para trabajo colaborativo
Introducción al uso Git y GitHub para trabajo colaborativoIntroducción al uso Git y GitHub para trabajo colaborativo
Introducción al uso Git y GitHub para trabajo colaborativo
 
Mini-tutorial de git
Mini-tutorial de gitMini-tutorial de git
Mini-tutorial de git
 
Introducción a git
Introducción a gitIntroducción a git
Introducción a git
 
Integrando sonar
Integrando sonarIntegrando sonar
Integrando sonar
 
Git: control de versiones
Git: control de versionesGit: control de versiones
Git: control de versiones
 
Git with Scrum en español
Git with Scrum en españolGit with Scrum en español
Git with Scrum en español
 
Git - Gitlab
Git - GitlabGit - Gitlab
Git - Gitlab
 

Similaire à Dependency Managers iOS

Presentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones SegurasPresentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones SegurasJosé Moreno
 
GuiaPrincipiantesGitHubrfuenzalidadev.pptx
GuiaPrincipiantesGitHubrfuenzalidadev.pptxGuiaPrincipiantesGitHubrfuenzalidadev.pptx
GuiaPrincipiantesGitHubrfuenzalidadev.pptxfuenzalidarodrigo
 
Control de versiones utilizando Git
Control de versiones utilizando GitControl de versiones utilizando Git
Control de versiones utilizando GitHugo Gilmar Erazo
 
Manual para usuarios de Git @patxiredes.pdf
Manual para usuarios de Git @patxiredes.pdfManual para usuarios de Git @patxiredes.pdf
Manual para usuarios de Git @patxiredes.pdfCarlosJurado61
 
Gestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterGestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterandrewzg
 
Control de versiones con git
Control de versiones con gitControl de versiones con git
Control de versiones con gitEudris Cabrera
 
Introducción a Git
Introducción a GitIntroducción a Git
Introducción a GitManuel Ceron
 
Presentación SUbversion
Presentación SUbversionPresentación SUbversion
Presentación SUbversionrxif914u41
 
Presentacion Subversion
Presentacion SubversionPresentacion Subversion
Presentacion SubversionCesar Yanez
 
Sistemas para el Control de Versiones de Código
Sistemas para el Control de Versiones de CódigoSistemas para el Control de Versiones de Código
Sistemas para el Control de Versiones de CódigoJesus Castagnetto
 
Primeros pasos con git
Primeros pasos con gitPrimeros pasos con git
Primeros pasos con gitJuan Vladimir
 
Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7Juan Fede
 
Introducción a GIT
Introducción a GITIntroducción a GIT
Introducción a GITmaxfontana90
 

Similaire à Dependency Managers iOS (20)

Presentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones SegurasPresentacion #2 github Aplicaciones Seguras
Presentacion #2 github Aplicaciones Seguras
 
GuiaPrincipiantesGitHubrfuenzalidadev.pptx
GuiaPrincipiantesGitHubrfuenzalidadev.pptxGuiaPrincipiantesGitHubrfuenzalidadev.pptx
GuiaPrincipiantesGitHubrfuenzalidadev.pptx
 
Control de versiones utilizando Git
Control de versiones utilizando GitControl de versiones utilizando Git
Control de versiones utilizando Git
 
Manual para usuarios de Git @patxiredes.pdf
Manual para usuarios de Git @patxiredes.pdfManual para usuarios de Git @patxiredes.pdf
Manual para usuarios de Git @patxiredes.pdf
 
Git 01-introduccion
Git 01-introduccionGit 01-introduccion
Git 01-introduccion
 
Atix30
Atix30Atix30
Atix30
 
Gestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniterGestionar mis proyectos con ayuda de CodeIgniter
Gestionar mis proyectos con ayuda de CodeIgniter
 
Control de versiones con git
Control de versiones con gitControl de versiones con git
Control de versiones con git
 
Introducción a Git
Introducción a GitIntroducción a Git
Introducción a Git
 
Taller GitHub
Taller GitHubTaller GitHub
Taller GitHub
 
Presentación SUbversion
Presentación SUbversionPresentación SUbversion
Presentación SUbversion
 
Presentacion Subversion
Presentacion SubversionPresentacion Subversion
Presentacion Subversion
 
Sistemas para el Control de Versiones de Código
Sistemas para el Control de Versiones de CódigoSistemas para el Control de Versiones de Código
Sistemas para el Control de Versiones de Código
 
Git.manual.usuario
Git.manual.usuarioGit.manual.usuario
Git.manual.usuario
 
Tutorial codeblocks(2)
Tutorial codeblocks(2)Tutorial codeblocks(2)
Tutorial codeblocks(2)
 
Primeros pasos con git
Primeros pasos con gitPrimeros pasos con git
Primeros pasos con git
 
Netbeans
NetbeansNetbeans
Netbeans
 
Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7Tutorial CodeIgniter + Netbeans 7
Tutorial CodeIgniter + Netbeans 7
 
Git y github básico
Git y github básicoGit y github básico
Git y github básico
 
Introducción a GIT
Introducción a GITIntroducción a GIT
Introducción a GIT
 

Dependency Managers iOS

  • 1. Dependency Managers S u b m ó d u l o s G I T C o c o a p o d s C a r t h a g e
  • 2. Soy Angel Morales iOS Developer @ Deloitte Digital ¡ Hola ! http://medium.com/@angelmoralesk https://github.com/ctime95
  • 3. Agenda ¿Qué son los dependency managers? Submódulos Git Carthage Dependencias Ventajas ¿Por qué no conviene gestionar dependencias manualmente? Cocoapods Conceptos Ejemplo : Agregar framework como submódulo Git Conceptos Ejemplo: Integrar Lottie con Carthage Conclusiones Conceptos Ejemplo: Integrar Cocoapods en una librería Cocoa Touch Gestionando cambios Comandos adicionales Semantic Versioning Un vistazo a Lockfiles
  • 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
  • 7. Dependency Managers no es exclusivo en iOS
  • 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.
  • 14. Ejemplo: Agregar framework Circle-Menu como submódulo Git
  • 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
  • 22. Repositorio MainProject Repositorio Circle - menu MainProject Circle - menu Último commit 36abcz ViewController.swift Modelo.swift Commit submodulo 36abcz GESTIONANDO CAMBIOS DEL SUBMÓDULO
  • 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
  • 34. Semantic Versioning ~> 1.4.7Ejemplos: Ok, actualizar este númeroActualizar el último número de versión 1.4.8 1.4.9 1.4.10 ~> 3.3 3.3.5 3.4.0 3.7.0
  • 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.
  • 41. Podfile ‘Libreria’ : 1.3.3 pod ‘Libreria’ ~> 1.3 Instalado : 1.3.3 pod install Un vistazo a Podfile.lock
  • 42. Podfile ‘Libreria’ : 1.4.0 pod ‘Libreria’ ~> 1.3 Instalado : 1.3.3 Un vistazo a Podfile.lock
  • 43. Podfile Podfile ‘Libreria’ : 1.4.0 pod ‘Libreria’ ~> 1.3 Instalado : 1.3.3 Un vistazo a Podfile.lock pod ‘Libreria’ ~> 1.3
  • 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
  • 47. 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
  • 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
  • 49. 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.4.0 pod update Instalado : 1.4.0 Pero al usar ”pod update…” Un vistazo a Podfile.lock
  • 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