Clikt : Un framework CLI puissant pour Kotlin
Clikt est un framework moderne et léger pour créer des applications console (CLI) en langage Kotlin. Contrairement à de nombreuses autres bibliothèques, Clikt utilise une approche déclarative, permettant de décrire la structure des commandes et leurs paramètres à l'aide d'annotations simples et d'expressions lambda. Cela rend le code propre, lisible et facile à maintenir. La bibliothèque est idéale aussi bien pour de petits utilitaires que pour des interfaces en ligne de commande complexes à plusieurs niveaux.
Fonctionnalités clés de Clikt
- Syntaxe déclarative : Définition des commandes, options et arguments via un DSL (Domain Specific Language) ou des annotations.
- Génération automatique d'aide : Clikt crée automatiquement un message
--helpbeau et structuré basé sur vos définitions. - Prise en charge des commandes imbriquées : Créez des hiérarchies de commandes (par exemple,
git commit,git push) avec un mécanisme simple de sous-commandes. - Validation des valeurs : Mécanismes intégrés pour vérifier les types, plages, formats et conditions personnalisées.
- Autocomplétion : Prise en charge native de la génération de scripts d'autocomplétion pour Bash, Zsh et Fish.
- Testabilité : Outils pratiques pour tester les applications CLI sans exécution réelle dans le terminal.
Installation et configuration
Pour commencer, ajoutez la dépendance à votre fichier build.gradle.kts :
repositories { mavenCentral()}
dependencies { implementation("com.github.ajalt.clikt:clikt:4.4.0")}Pour Maven, utilisez :
<dependency> <groupId>com.github.ajalt.clikt</groupId> <artifactId>clikt</artifactId> <version>4.4.0</version></dependency>Exemple de base : salutation
Créons une commande simple qui prend un nom d'utilisateur et un indicateur optionnel pour saluer dans différentes langues.
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 = "Nom d'utilisateur") val formal: Boolean by option("--formal", "-f", help = "Salutation formelle").flag()
override fun run() { val greeting = if (formal) "Bonjour" else "Salut" echo("$greeting, $name!") }}
fun main(args: Array<String>) = Greet().main(args)Exécution en ligne de commande :
$ kotlin greet.kts JeanSalut, Jean!
$ kotlin greet.kts --formal JeanBonjour, Jean!
$ kotlin greet.kts --helpUsage: greet [<options>] <name>
Nom d'utilisateur
Options: -f, --formal Salutation formelle -h, --help Show this message and exitExemple avancé : travail avec des fichiers et sous-commandes
Considérons un scénario plus complexe — un utilitaire pour travailler avec des fichiers texte prenant en charge les sous-commandes count et 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 // La commande racine ne fait rien}
class Count : CliktCommand(help = "Compter les lignes dans un fichier") { val file: File by argument(help = "Chemin vers le fichier") .validate { require(it.exists()) { "Fichier non trouvé : $it" } }
override f