Skip to main content

Refinando la Tarea de Copiado

⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.


Hasta ahora, hemos creado una tarea que copia los archivos JAR de la biblioteca al módulo app. Sin embargo, esta tarea copia todos los archivos generados en el directorio build/libs, lo que puede no ser ideal. Podemos mejorar esta tarea permitiendo especificar qué archivos JAR deben ser copiados.

Definición de una Extensión

Para lograr esto, definiremos una extensión que nos permita configurar la tarea copyLib para copiar solo los archivos que necesitamos. Esta extensión se colocará en el paquete extensions dentro del módulo convention-plugins.

convention-plugins/src/main/kotlin/extensions/CopyLibExtension.kt
package extensions

abstract class CopyLibExtension {
abstract var libNames: List<String>
}

En este código, libNames es una lista de cadenas que representará los nombres (o prefijos) de los archivos JAR que queremos copiar. Ahora, podemos registrar esta extensión en el archivo compile.conventions.gradle.kts para que esté disponible para la tarea copyLib.

Registro de la Extensión

Vamos a registrar la extensión CopyLibExtension en nuestro archivo de convenciones:

convention-plugins/src/main/kotlin/compile.conventions.gradle.kts
import extensions.CopyLibExtension

// Crear la extensión `copyLib`
extensions.create<CopyLibExtension>("copyLib")

Configurando la Tarea copyLib

Ahora que tenemos la extensión registrada, podemos configurarla para que solo copie los archivos que coincidan con los nombres especificados en libNames. La configuración de la extensión la haremos en el archivo build.gradle.kts o build.gradle de la biblioteca.

lib/build.gradle.kts
copyLib {
libNames = listOf("lib-.+-all", /* Agregar más nombres si es necesario */)
}

Para la última parte, dividiremos la solución en partes para que sea más fácil de seguir.

Primero debemos acceder a la extensión CopyLibExtension en la tarea copyLib para obtener los nombres de los archivos JAR que queremos copiar.

convention-plugins/src/main/kotlin/compile.conventions.gradle.kts
// ...
tasks.register<Copy>("copyLib") {
// ...
val libNames = project.extensions.getByType<CopyLibExtension>().libNames
}
Ejercicio

Implementa las funciones isValidDirectory, getCopiedFileNames y findMissingFiles en el archivo compile.conventions.gradle.kts para verificar si los archivos JAR especificados en libNames se copiaron correctamente al directorio app/libs.

Si ahora corremos la tarea ./gradlew :app:run --args="Hello, world!", deberiamos ver un mensaje que indica que sólo las bibliotecas que cumplan con la expresión regular lib-.+-all fueron copiadas, esto significa que todos los archivos que tengan la forma lib-<algo>-all.jar serán copiados.

Conclusión

A lo largo de esta sección, hemos mejorado considerablemente el proceso de copia de bibliotecas empaquetadas en archivos JAR, permitiendo especificar qué archivos copiar y verificando que los archivos se copien correctamente. Esto nos permite tener un mayor control sobre el proceso de empaquetado y despliegue de las bibliotecas en Gradle.

Resumen:

  1. Definición de una extensión: Creamos una extensión para especificar qué archivos JAR deben copiarse.
  2. Automatización de la tarea copyLib: Ajustamos la tarea para que copie solo los archivos necesarios, basándose en los nombres definidos en la extensión.
  3. Verificación de archivos copiados: Implementamos una verificación para asegurarnos de que todos los archivos especificados fueron copiados exitosamente al directorio de destino.

Este proceso garantiza que solo las bibliotecas necesarias sean empaquetadas y utilizadas por el módulo app, lo que nos ayuda a mantener un flujo de trabajo eficiente y libre de errores. Ahora estamos mejor equipados para gestionar múltiples bibliotecas en proyectos más grandes y complejos, con un control más preciso sobre qué bibliotecas incluir y cómo gestionar su copia.