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")
}
}
Также в библиотеке
CLI фреймворк для C# (.NET): System.CommandLine и Spectre.Console
Аутентификация и авторизация в Swift: LocalAuthentication, Firebase Auth, Keychain
JSON обработка в PHP: функции, примеры и best practices
Работа с Excel в JavaScript (Node.js): библиотеки и инструменты
Dokka для Kotlin: полное руководство с примерами
Рекомендаций