Clikt:用于Kotlin的强大CLI框架
Clikt 是一个用于在Kotlin语言中创建控制台(CLI)应用程序的现代、轻量级框架。与许多其他库不同,Clikt采用声明式方法,允许通过简单的注解和lambda表达式来描述命令结构及其参数。这使得代码干净、可读且易于维护。该库既适用于小型工具,也适用于复杂的多层命令行界面。
Clikt的关键特性
- 声明式语法:通过DSL(领域特定语言)或注解定义命令、选项和参数。
- 自动生成帮助信息:Clikt会根据您的定义自动生成美观且结构化的
--help消息。 - 支持嵌套命令:通过简单的子命令机制创建命令层次结构(例如,
git commit、git push)。 - 值验证:内置机制用于检查类型、范围、格式和自定义条件。
- 自动补全:原生支持为Bash、Zsh和Fish生成自动补全脚本。
- 可测试性:无需在终端中实际运行即可测试CLI应用程序的便捷工具。
安装与配置
首先,将依赖项添加到您的build.gradle.kts中:
repositories { mavenCentral()}
dependencies { implementation("com.github.ajalt.clikt:clikt:4.4.0")}对于Maven,请使用:
<dependency> <groupId>com.github.ajalt.clikt</groupId> <artifactId>clikt</artifactId> <version>4.4.0</version></dependency>基本示例:问候
让我们创建一个简单的命令,该命令接受用户名和一个可选标志,用于以不同语言问候。
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 = "用户名") val formal: Boolean by option("--formal", "-f", help = "正式问候").flag()
override fun run() { val greeting = if (formal) "您好" else "你好" echo("$greeting, $name!") }}
fun main(args: Array<String>) = Greet().main(args)从命令行运行:
$ kotlin greet.kts 伊万你好, 伊万!
$ kotlin greet.kts --formal 伊万您好, 伊万!
$ kotlin greet.kts --helpUsage: greet [<options>] <name>
用户名
Options: -f, --formal 正式问候 -h, --help Show this message and exit高级示例:文件操作与子命令
考虑一个更复杂的场景——一个用于处理文本文件的工具,支持count和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 // 根命令不执行任何操作}
class Count : CliktCommand(help = "统计文件中的行数") { val file: File by argument(help = "文件路径") .validate { require(it.exists()) { "文件未找到: $it" } }
override f