¿Por qué Kotlin es el lenguaje ideal para utilidades CLI?
\n\nCuando 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\nImagina: 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\nPara 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
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\nPaso 1: Configuración del proyecto para la utilidad CLI
\n\nCreemos un proyecto simple de Gradle. Aquí está el build.gradle.kts mínimo:
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\nObserva 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\nPaso 2: Escribimos el primer comando
\n\nCreemos el archivo src/main/kotlin/com/pythonlib/cli/Main.kt:
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\nEsta 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\nSolo 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\nPaso 3: Comandos multinivel (como en Git)
\n\nLas aplicaciones de consola en Kotlin reales rara vez consisten en un solo comando. Hagamos una utilidad para trabajar con archivos que admita subcomandos:
\n\nimport com.github.ajalt.clikt.core.subcommands\n\nclass FileTool : CliktCommand(\n name