Utilidades CLI de Kotlin: escribiendo desde la consola desde cero

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué Kotlin es el lenguaje ideal para utilidades CLI?

\n\n

Cuando se trata de crear herramientas de consola, muchos desarrolladores recurren por costumbre a Python o Bash. Pero si ya conoces Kotlin (y en nuestro sitio web pythonlib.ru estamos seguros de que un buen desarrollador domina varios idiomas), sabes lo conciso y expresivo que es este lenguaje. Crear utilidades CLI en Kotlin no es solo una moda, sino una forma real de obtener herramientas rápidas, tiposeguras y multiplataforma.

\n\n

Imagina: escribes una aplicación de consola en Kotlin que se compila en un JAR o en un binario nativo a través de GraalVM o Kotlin/Native. Se ejecuta en cualquier lugar, desde un servidor Linux hasta la máquina Windows de un colega. Además, el código resulta ser 2-3 veces más corto que en Java y mucho más seguro que en Python. ¿Suena tentador? Vamos a verlo.

\n\n

¿Qué necesitas para empezar?

\n\n

Para crear Kotlin CLI necesitarás como mínimo:

\n
    \n
  • JDK 11+ instalado (recomiendo 17 o 21)
  • \n
  • IntelliJ IDEA (la versión Community es suficiente) o cualquier editor de texto
  • \n
  • Conocimientos básicos de Kotlin (funciones, clases, colecciones)
  • \n
  • Gradle o Maven para la compilación
  • \n
\n\n

Si aún no has trabajado con Kotlin en la consola, no te preocupes. Recorreremos el camino desde un archivo vacío hasta una utilidad completa que puedas publicar y usar en pipelines de CI/CD.

\n\n

Paso 1: Configuración del proyecto para la utilidad CLI

\n\n

Creemos un proyecto simple de Gradle. Aquí está el build.gradle.kts mínimo:

\n\n
plugins {\n    kotlin("jvm") version "1.9.22"\n    application\n}\n\napplication {\n    mainClass.set("com.pythonlib.cli.MainKt")\n}\n\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation("com.github.ajalt.clikt:clikt:4.2.2")\n    implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.6")\n}
\n\n

Observa dos bibliotecas clave: Clikt y Kotlinx CLI. La primera es la biblioteca más popular para crear utilidades CLI en Kotlin. La segunda es la solución oficial de JetBrains. En este artículo usaremos Clikt, ya que ofrece más flexibilidad y se ve mejor.

\n\n

Paso 2: Escribimos el primer comando

\n\n

Creemos el archivo src/main/kotlin/com/pythonlib/cli/Main.kt:

\n\n
package com.pythonlib.cli\n\nimport com.github.ajalt.clikt.core.CliktCommand\nimport com.github.ajalt.clikt.parameters.arguments.argument\nimport com.github.ajalt.clikt.parameters.options.option\nimport com.github.ajalt.clikt.parameters.options.flag\n\nclass GreetCommand : CliktCommand(\n    name = "greet",\n    help = "Saluda al usuario"\n) {\n    private val name: String by argument(\n        help = "Nombre del usuario"\n    )\n\n    private val uppercase: Boolean by option(\n        "--uppercase", "-u",\n        help = "Mostrar el nombre en mayúsculas"\n    ).flag()\n\n    override fun run() {\n        val greeting = "¡Hola, $name!"\n        if (uppercase) {\n            echo(greeting.uppercase())\n        } else {\n            echo(greeting)\n        }\n    }\n}\n\nfun main(args: Array<String>) {\n    GreetCommand().main(args)\n}
\n\n

Esta es una utilidad CLI de Kotlin muy simple que acepta un nombre y una bandera opcional. Ejecutémosla:

\n\n
./gradlew run --args="Alejandro --uppercase"\n# Salida: ¡HOLA, ALEJANDRO!
\n\n

Solo 30 líneas de código y ya tenemos una herramienta de consola funcional. Clikt genera automáticamente la ayuda, maneja errores y admite autocompletado para bash/zsh.

\n\n

Paso 3: Comandos multinivel (como en Git)

\n\n

Las aplicaciones de consola en Kotlin reales rara vez consisten en un solo comando. Hagamos una utilidad para trabajar con archivos que admita subcomandos:

\n\n
import com.github.ajalt.clikt.core.subcommands\n\nclass FileTool : CliktCommand(\n    name                

Blogs

Book Recommendations