Bienvenido, soy Miguel y aquí les traigo un nuevo post.
Índice
Permita que su equipo realice un desarrollo móvil escalable
En este artículo, comparto cómo modularizar las aplicaciones de iOS y Android en diferentes módulos. Hay muchos beneficios de modular nuestras aplicaciones en partes más pequeñas, como un código de arquitectura más limpio (es decir, evitar dependencias circulares) y escalar el desarrollo móvil.
Aplicación de ejemplo
Para demostrar la modularización, dividiré la estructura de la aplicación en diferentes partes, como se muestra a continuación. Esto también demuestra el vínculo transitivo de la relación entre módulos.
Además, también aprovecharemos el conocimiento de cómo administrar dependencias (por ejemplo, una biblioteca de terceros) para manejar el enlace entre diferentes módulos.
Modularizar en iOS
Estamos usando la pod lib create
función CocoaPods para crear el módulo de pod. Cada módulo ahora se vinculará a sus pods externos necesarios, como se muestra a continuación.
Antes de crearlo, hice una carpeta con el nombre de modules
la carpeta raíz de mi proyecto para que todos los pods creados a medida se puedan agrupar allí. En nuestro caso, se verá así:
RootProjectFolder |-modules |-Fetcher |-WikipediaFetcher
Ahora estamos listos para crear esos pods.
Crea el pod (para Fetcher)
Ingrese a la modules
carpeta y simplemente use el siguiente comando:
pod lib create <Pod Name>
En nuestro caso, el nombre de la vaina es Fetcher
.
Se hará una lista de preguntas:
What platform do you want to use?? [ iOS / macOS ] What language do you want to use?? [ Swift / ObjC ] Would you like to include a demo application with your library? [ Yes / No ] Which testing frameworks will you use? [ Quick / None ] Would you like to do view based testing? [ Yes / No ]
Haga clic Enter
para obtener la configuración predeterminada. Se creará el pod.
Nota: El proyecto de ejemplo se iniciará automáticamente en Xcode si desea trabajar desde allí. De lo contrario, puede cerrarlo y eliminarlo.
Edite la Podspec (para Fetcher)
Después de aumentar el pod, acceda a la carpeta del módulo (por ejemplo, Fetcher
). Encontrará este archivo: fetcher.podspec
.
El encabezado muestra el nombre y la versión, así como una descripción que puede editar.
Pod::Spec.new do |s| s.name = 'Fetcher' s.version = '0.1.0' s.summary = 'A short description of Fetcher.'
La otra parte que debe tener en cuenta se encuentra en la siguiente sección, donde puede agregar más dependencias. Para nuestro caso, cambié el target
de '8.0'
a '9.0'
y agregué s.dependency 'Alamorefire', '4.8.1'
.
s.ios.deployment_target = '9.0' s.dependency 'Alamofire', '4.8.1' s.source_files = 'Fetcher/Classes/**/*'
La otra parte a tener en cuenta es s.source_files
. Muestra dónde colocará sus .swift
códigos. De forma predeterminada, hay un archivo con ese nombre ReplaceMe.swift
, que puede eliminar y reemplazar con su propio archivo fuente.
Nota: Hay otras partes en Podspec que puede modificar según lo considere apropiado.
Vincular el proyecto principal con el pod
El proyecto principal aún no sabrá que existe el pod. Para avisarle, puede editar el Podfile
del proyecto agregando la siguiente línea:
target 'NetworkExperiment' do # Comment the next line if you're not using Swift .... use_frameworks!# Pods for NetworkExperiment pod 'Fetcher', :path => './modules/Fetcher' end
Después de guardar el archivo, debe ejecutar un pod install
comando para cargarlo en el espacio de trabajo del proyecto.
Crear el pod (WikipediaFetcher)
Siguiendo los mismos pasos que para el Fetcher
pod, procederemos a:
- Cree el pod ejecutándolo
pod lib create WikipediaFetcher
en lamodules
carpeta. - Edite
Wikipedia.podspec
agregando las bibliotecas necesarias.
s.ios.deployment_target = '9.0' s.dependency 'SwiftyJSON', '5.0.0' s.dependency 'Fetcher', '0.1.0' s.source_files = 'WikipediaFetcher/Classes/**/*'
Nota: Además de agregar el SwiftyJSON
, también necesitaremos agregarlo Fetcher
como una biblioteca de pod. Tenga en cuenta que esto solo se puede hacer después de que Fetcher
se agregue al Podfile
proyecto principal.
Por último, agregue el WikipediaFetcher
pod al proyecto principal Podfile.
target 'NetworkExperiment' do # Comment the next line if you're not using Swift... use_frameworks!# Pods for NetworkExperiment pod 'WikipediaFetcher', :path => './modules/WikipediaFetcher' pod 'Fetcher', :path => './modules/Fetcher' end
Ahora, recuerde hacerlo pod install
. ¡Eso es! Ya tienes tu proyecto configurado.
Otras notas
- Cada uno de los pods, incluido el proyecto, necesita acceder a algunas clases en Alamofire. Cada uno de ellos accede a Alamoefire a través de la
Fetcher
cápsula. - Se deben declarar todas las clases y funciones del pod a las que deberían poder acceder otros pods
public
. Esto también incluye lainit
función, donde se necesita declarar explícitamente un vacíoinit
, como se muestra a continuación.
public init() {}
- A partir del experimento, aunque los pods no están vinculados al marco UIKit de iOS, aún podríamos acceder a ellos con solo usar
import UIKit
. Personalmente, pensé que estarías.ios.framework = 'UIKit'
en el archivo Podspec, pero no estoy del todo seguro de por qué podría obtenerlo sin agregar el marco. Más detalles aquí .
Modularizar en Android
En Android, modularizamos usando Android Studio directamente. Particionaremos el código, donde las bibliotecas se cargarán mediante módulos individuales.
Aquí solo crearemos el módulo en el nivel superior, ya que se manejan de la misma manera que el proyecto principal (es decir, un solo build.gradle
archivo para cada uno de ellos).
A diferencia de iOS, Android tiene diferentes tipos de módulos para elegir. Aquí, estoy creando un módulo de Android y un módulo Kotlin simple, como se indica en el diagrama anterior.
Crea el módulo Fetcher
los Fetcher
módulo solo tendrá más código Kotlin accediendo al OkHttp biblioteca (que no necesita un marco de Android). Por lo tanto, solo crearé un módulo Kotlin, como se muestra a continuación.
Vaya a Archivo → Nuevo → Nuevo módulo…
Luego, elija «Biblioteca Java o Kotlin».
Después de eso, escriba el nombre del módulo. Usamos minúsculas, ya que normalmente el nombre del paquete también está en minúsculas.
Al hacer clic en Finalizar, se generará el módulo.
Modificar el archivo build.gradle
Busque el buscador build.gradle
archivo (ubicado en la carpeta raíz del módulo Fetcher).
Solo necesita agregar sus dependencias allí. En nuestro caso, es el okhttp
biblioteca.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation
"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api 'com.squareup.okhttp3:okhttp:3.12.0'
}
Nota: Estamos usando api
en lugar de implementation
porque estamos dejando que el módulo superior (WikipediaFetcher
y App
) acceder al okhttp
biblioteca de aquí también.
La mejor práctica es evitar el uso api
y usando implementation
. De esta forma, todos los módulos deberán incluir sus propios okhttp
biblioteca para evitar una dependencia innecesaria en el módulo inferior que cambia internamente y acelera la compilación.
Habrá alguna sincronización de versiones y manejo de exclusiones (por ejemplo, si ambas bibliotecas están usando diferentes versiones de okhttp
). Para evitar entrar en esas discusiones, lo simplifico usando api
.
Después de hacer eso, puede sincronizar su proyecto y agregar el código intp en la carpeta del paquete respectivo (por ejemplo, com/elyeproject/fetcher
) creado para ti.
Crea el módulo WikipediaFetcher
En su lugar, crearemos una biblioteca de Android para esto porque necesita acceder AndroidSchedulers.mainThread()
, que requiere el marco de Android.
Vaya a Archivo → Nuevo → Nuevo módulo … y, en lugar de crear una biblioteca Java o Kotlin, seleccione «Biblioteca de Android».
Complete el nombre en consecuencia y asegúrese de que todas las configuraciones coincidan con lo que desea.
Haga clic en Finalizar y obtendrá lo siguiente. Puede eliminar la prueba si no la está utilizando. Quédate con los demás.
Después de esto, puede modificar el build.gradle
archivo que se encuentra en el WikipediaFetcher
carpeta del módulo.
Agregue las bibliotecas necesarias allí:
dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) api project(':fetcher') implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.code.gson:gson:2.8.6' api "io.reactivex.rxjava2:rxjava:2.2.19" implementation "io.reactivex.rxjava2:rxandroid:2.1.1" testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'}
Para acceder al fetcher
módulo aquí, agregamos api project(':fetcher')
. Esta usando api
, ya que necesitamos acceder al okHttp
dentro de fetcher
, también.
Nota: Usamos implementation
para gson
y rxandroid
, ya que el módulo de nivel superior no requiere acceder a él. Pero agregamos api
a rxjava
, ya que el módulo de nivel superior necesita acceder al disposable
.
Después de hacer eso, puede sincronizar su proyecto y agregar el código en la carpeta del paquete respectivo (por ejemplo, com/elyeproject/wikipediafetcher
) creado para ti.
Enlace al módulo de la aplicación principal
Después de crear tanto el Fetcher
y WikipediaFetcher
módulos, ahora debemos informar al módulo de la aplicación de nivel superior para vincularlos.
Abre el build.gradle
archivo de la app
módulo y agregue el WikipediaFetcher
módulo allí.
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api project(':wikipediafetcher')
implementation
"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation
'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation
'androidx.test.espresso:espresso-core:3.2.0'
}
Como se mencionó anteriormente, estamos usando api
aquí porque el app
módulo necesita acceder al módulo subyacente que está vinculado desde wikipediaFetcher
también (es decir, el interceptor desechable de RxJava y el de OkHttp).
Una vez hecho esto, puede sincronizar el proyecto y import
código del módulo inferior.
Una vez que el código esté listo, puede compilarlo y ejecutarlo. Todo debería funcionar a la perfección como en un solo proyecto.
Conclusión
Puede obtener el código aquí . Espero que esto ayude y mejore la estructura y planificación de su código. Feliz codificación en ambas plataformas.
Gracias por leer.
Añadir comentario