Clikt: Poderoso framework CLI para Kotlin
Clikt é um framework moderno e leve para criar aplicações de console (CLI) na linguagem Kotlin. Ao contrário de muitas outras bibliotecas, o Clikt utiliza uma abordagem declarativa, permitindo descrever a estrutura dos comandos e seus parâmetros com anotações simples e expressões lambda. Isso torna o código limpo, legível e fácil de manter. A biblioteca é ideal tanto para pequenas utilidades quanto para interfaces de linha de comando complexas e multinível.
Principais recursos do Clikt
- Sintaxe declarativa: Definição de comandos, opções e argumentos através de DSL (Domain Specific Language) ou anotações.
- Geração automática de ajuda: O Clikt cria automaticamente uma mensagem
--helpbonita e estruturada com base nas suas definições. - Suporte a comandos aninhados: Crie hierarquias de comandos (por exemplo,
git commit,git push) com um mecanismo simples de subcomandos. - Validação de valores: Mecanismos integrados para verificar tipos, intervalos, formatos e condições personalizadas.
- Autocompletar: Suporte nativo para geração de scripts de autocompletar para Bash, Zsh e Fish.
- Testabilidade: Ferramentas convenientes para testar aplicações CLI sem execução real no terminal.
Instalação e configuração
Para começar, adicione a dependência ao seu build.gradle.kts:
repositories { mavenCentral()}
dependencies { implementation("com.github.ajalt.clikt:clikt:4.4.0")}Para Maven, use:
<dependency> <groupId>com.github.ajalt.clikt</groupId> <artifactId>clikt</artifactId> <version>4.4.0</version></dependency>Exemplo básico: saudação
Vamos criar um comando simples que recebe um nome de usuário e uma flag opcional para saudar em diferentes idiomas.
import com.github.ajalt.clikt.core.CliktCommandimport com.github.ajalt.clikt.parameters.arguments.argumentimport com.github.ajalt.clikt.parameters.options.flagimport com.github.ajalt.clikt.parameters.options.option
class Greet : CliktCommand() { val name: String by argument(help = "Nome do usuário") val formal: Boolean by option("--formal", "-f", help = "Saudação formal").flag()
override fun run() { val greeting = if (formal) "Olá" else "Oi" echo("$greeting, $name!") }}
fun main(args: Array<String>) = Greet().main(args)Execução a partir da linha de comando:
$ kotlin greet.kts JoãoOi, João!
$ kotlin greet.kts --formal JoãoOlá, João!
$ kotlin greet.kts --helpUsage: greet [<options>] <name>
Nome do usuário
Options: -f, --formal Saudação formal -h, --help Show this message and exitExemplo avançado: trabalho com arquivos e subcomandos
Vamos considerar um cenário mais complexo — uma utilidade para trabalhar com arquivos de texto com suporte aos subcomandos count e search.
import com.github.ajalt.clikt.core.CliktCommandimport com.github.ajalt.clikt.core.subcommandsimport com.github.ajalt.clikt.parameters.arguments.argumentimport com.github.ajalt.clikt.parameters.options.defaultimport com.github.ajalt.clikt.parameters.options.optionimport java.io.File
class FileTool : CliktCommand() { override fun run() = Unit // Comando raiz não faz nada}
class Count : CliktCommand(help = "Contar linhas no arquivo") { val file: File by argument(help = "Caminho para o arquivo") .validate { require(it.exists()) { "Arquivo não encontrado: $it" } }
override f Também na biblioteca
Trabalhando com Kafka em PHP: bibliotecas, conexão e exemplos de código
Envio de SMS via API no Node.js: biblioteca twilio
Cliente OAuth para PHP: autenticação via redes sociais e API
Nodemon para JavaScript (Node.js): guia completo com exemplos