Veritas Ep. 1: Tu primer proyecto con Gradle

Abstract

Hello my name is: Veritas

Veritas es una biblioteca de validación de datos que construiremos de manera incremental a lo largo del curso. Su objetivo es ofrecer una API clara y extensible para declarar reglas, componer validaciones y obtener resultados expresivos, facilitando su uso tanto en aplicaciones como en otras bibliotecas. Iremos viendo cómo lograr estos objetivos paso a paso.

Comenzar un proyecto desde cero puede sentirse abrumador, incluso aterrador. Muchas veces no sabemos por dónde empezar, tropezamos en el camino y nos enfrentamos a decisiones que parecen correctas en un momento, pero de las que luego podemos arrepentirnos.

Por eso, Veritas no es solo una biblioteca: es también una historia que contaremos juntos. Una historia que nos servirá de guía para recorrer el proceso completo de creación de una biblioteca desde cero.

Veritas es, en última instancia, una excusa para aprender haciendo: para experimentar, equivocarnos, corregir el rumbo y descubrir cómo se construyen bibliotecas sólidas y reutilizables en el mundo real.

Estructura inicial de proyectos del curso

Comencemos creando una organización básica para los proyectos del curso. Esta carpeta puede ser compartida entre otros proyectos; si decides no usarla, solo tendrás que adaptar las rutas en los comandos posteriores.

(Opcional) Integrar con Git

Si quieres versionar tu estructura desde el inicio, puedes crear el repositorio local y el remoto en GitLab de forma automatizada. Te sugiero ejecutar primero un ensayo con -WhatIf (PowerShell) o --dry-run (Bash) para validar qué va a ocurrir.

Flujo sugerido (con ensayo primero)

.gitignore

Genera un .gitignore adecuado para cada repo; puede ayudarte: toptal.com/developers/gitignore .

Submódulos Git

Un submódulo es un repositorio independiente enlazado dentro de otro repositorio. Se usa cuando quieres mantener el historial y la evolución de un proyecto externo (o de otro repo tuyo) sin copiar su contenido. Así, el repo principal guarda solo una referencia fija a un commit del submódulo. Puedes actualizar esa referencia cuando quieras, pero los cambios en el submódulo se gestionan por separado.

Aprende más sobre submódulos en la documentación de Atlassian.

Inicializar un proyecto con Gradle

Crearemos un script mínimo para generar un esqueleto de proyecto donde tú elijas. La clave es normalizar la ruta (soporta relativas) y ejecutar gradle init en ese directorio. Recomiendo probar 1  con -WhatIf / --dry-run antes.

gradle init

El comando gradle init crea la estructura inicial de un proyecto Gradle de manera guiada: puedes elegir tipo de proyecto (aplicación, biblioteca, etc.), DSL (Kotlin o Groovy) y nombre del proyecto, entre otros.

Notas

  1. Al usar DirectoryInfo con rutas relativas, PowerShell puede resolverlas respecto a otra base (p. ej., el perfil). Con Join-Path -Path $PWD.Path -ChildPath ... anclamos la ruta al directorio actual y evitamos crear el proyecto en otra ubicación.

    El error original apareció al no usar Join-Path :

    What if: Performing the operation "Create Directory" on target "Destination: C:\Users\usuario\veritas".
    What if: Performing the operation "gradle init" on target "C:\Users\usuario\veritas".
            

    Gracias a -WhatIf / --dry-run , detectamos al instante que apuntaba a C:\Users\... en vez de E:\...\Dibs. El ensayo reveló el fallo y la corrección segura fue normalizar la ruta antes de gradle init.

    Volver
  2. Puedes ajustar #Requires a otra versión, pero no garantizamos compatibilidad con PowerShell anterior. Volver
  3. ConfirmImpact='Medium' indica que la acción es importante y puede requerir confirmación en entornos sensibles. Volver
    • [Parameter(Mandatory)] marca $ProjectRoot como obligatorio.
    • [ValidateNotNullOrEmpty()] asegura que no sea nulo o vacío.
    • [string] : tipo de dato de la variable.

    Ejemplo de uso: .\Initialize-GradleProject.ps1 -ProjectRoot foo -GradleOptions "--type kotlin-application","--dsl kotlin" .

    Volver
  4. $PWD es una variable automática que guarda el directorio actual. Volver
  5. -LiteralPath evita que caracteres especiales se interpreten como comodines. -PathType Container asegura que sea carpeta, no archivo. $PSCmdlet.ShouldProcess permite ensayar acciones con -WhatIf o -Confirm . Volver
  6. Get-Command encuentra el ejecutable real, aunque haya alias. -ErrorAction Stop corta si no se encuentra. Volver
  7. & es el call operator: ejecuta la ruta guardada en $gradle . -p fija el directorio del proyecto. @GradleOptions usa splatting para expandir el arreglo como argumentos separados. Volver
  8. Por convención, 0 significa éxito; cualquier otro código indica error. Volver
  9. [CmdletBinding()] habilita parámetros comunes como -Verbose y -Debug . Volver