CLI фреймворки для Kotlin: создание консольных приложений

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI фреймворки для Kotlin: создание мощных консольных приложений

Kotlin — современный язык, который активно используется не только для Android-разработки, но и для создания серверных и консольных приложений. Разработка CLI (Command Line Interface) инструментов на Kotlin может быть значительно упрощена с помощью специализированных фреймворков. В этой статье мы рассмотрим три наиболее популярных решения: Clikt, Kotlinx-cli и Aigrette, а также разберём их на практических примерах.

Зачем нужен CLI фреймворк?

Написание парсера аргументов командной строки вручную — утомительная и подверженная ошибкам задача. Фреймворки для CLI предоставляют:

  • Автоматический парсинг аргументов и опций
  • Генерацию справки (--help)
  • Валидацию входных данных
  • Поддержку подкоманд (subcommands)
  • Обработку ошибок с понятными сообщениями

Clikt — самый популярный выбор

Clikt — это мощная и гибкая библиотека, которая стала стандартом де-факто для CLI на Kotlin. Она использует декларативный подход с аннотациями и предоставляет богатый API.

Установка (через Gradle):

implementation("com.github.ajalt.clikt:clikt:4.2.1")

Пример простого приложения:

import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.types.int

class Greet : CliktCommand() {
    val name by argument()
    val count by option("--count", "-c", help = "Количество повторений").int().default(1)

    override fun run() {
        repeat(count) {
            echo("Привет, $name!")
        }
    }
}

fun main(args: Array<String>) = Greet().main(args)

Запуск:

./app --count 3 Иван
# Вывод:
# Привет, Иван!
# Привет, Иван!
# Привет, Иван!

Clikt поддерживает вложенные команды, автодополнение, цвета в консоли и строгую типизацию. Для сложных проектов (например, инструменты DevOps, утилиты для работы с API) это лучший выбор.

Kotlinx-cli — лёгкое решение от JetBrains

Kotlinx-cli — это официальная библиотека от создателей Kotlin. Она менее функциональна, чем Clikt, но идеально подходит для простых утилит и небольших проектов.

Установка:

implementation("org.jetbrains.kotlinx:kotlinx-cli:0.3.6")

Пример:

import kotlinx.cli.*

fun main(args: Array<String>) {
    val parser = ArgParser("file-util")
    val input by parser.argument(ArgType.String, description = "Входной файл")
    val output by parser.option(ArgType.String, shortName = "o", description = "Выходной файл").default("out.txt")
    val verbose by parser.option(ArgType.Boolean, shortName = "v", description = "Подробный вывод").default(false)

    parser.parse(args)

    println("Читаем из: $input")
    println("Пишем в: $output")
    if (verbose) println("Подробный режим включён")
}

Kotlinx-cli не требует дополнительных зависимостей и отлично подходит для быстрого прототипирования. Однако он не поддерживает вложенные команды и сложную валидацию.

Aigrette — функциональный подход

Aigrette — менее известная, но интересная библиотека, использующая функциональный стиль. Она основана на концепции "парсерных комбинаторов".

Установка:

implementation("io.github.petertrr:aigrette:0.3.0")

Пример:

import io.github.petertrr.aigrette.*

data class Config(val name: String, val age: Int, val flag: Boolean)

fun main() {
    val parser = command("app") {
        positional("name", ArgType.STRING) { "Имя пользователя" }
        option("--age", ArgType.INT, shortName = "-a") { "Возраст" }
        flag("--verbose", shortName = "-v") { "Подробный вывод" }
    }.parse(System.getenv("args")?.split(" ") ?: emptyList())

    parser?.let { (name, age, verbose) ->
        println("Имя: $name, возраст: $age, verbose: $verbose")
    }
}

Рекомендаций