Skip to main content

kingpin 用法

1. 简介

kingpin 是一个用于解析命令行参数的 Golang 库,提供类似 flag 但更强大和直观的 API,支持子命令、默认值、环境变量等。

2. 安装

go get github.com/alecthomas/kingpin

3. 基本用法

3.1 使用默认 App

kingpin 提供了默认的 kingpin.CommandLine,可以直接使用全局方法定义参数。

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

var (
name = kingpin.Flag("name", "输入你的名字。").Short('n').Default("World").String()
age = kingpin.Flag("age", "输入你的年龄。").Int()
)

func main() {
kingpin.Parse()
fmt.Printf("Hello %s! You are %d years old.\n", *name, *age)
}

运行示例:

./example --name=Alice --age=30

3.2 定义命令行参数(使用 New 方法)

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

func main() {
app := kingpin.New("example", "示例应用程序。")
name := app.Flag("name", "输入你的名字。").Short('n').Default("World").String()
age := app.Flag("age", "输入你的年龄。").Int()

kingpin.MustParse(app.Parse(os.Args[1:]))

fmt.Printf("Hello %s! You are %d years old.\n", *name, *age)
}

运行示例:

./example --name=Alice --age=30

3.3 使用子命令

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

func main() {
app := kingpin.New("app", "一个支持子命令的示例。")

// 定义子命令 `greet`
greetCmd := app.Command("greet", "打招呼。")
name := greetCmd.Flag("name", "你的名字。").Default("World").String()

// 定义子命令 `bye`
byeCmd := app.Command("bye", "告别。")
goodbye := byeCmd.Flag("message", "告别消息。").Default("Goodbye!").String()

switch kingpin.MustParse(app.Parse(os.Args[1:])) {
case greetCmd.FullCommand():
fmt.Printf("Hello, %s!\n", *name)
case byeCmd.FullCommand():
fmt.Println(*goodbye)
}
}

运行示例:

./app greet --name=Bob
./app bye --message="See you!"

3.4 绑定环境变量

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

func main() {
app := kingpin.New("env-example", "示例环境变量支持。")
name := app.Flag("name", "你的名字。").Envar("USER_NAME").Default("Anonymous").String()

kingpin.MustParse(app.Parse(os.Args[1:]))

fmt.Println("Hello,", *name)
}

运行示例:

export USER_NAME=Charlie
./env-example

3.5 处理布尔标志

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

func main() {
app := kingpin.New("bool-flag", "布尔标志示例。")
verbose := app.Flag("verbose", "开启详细模式。").Short('v').Bool()

kingpin.MustParse(app.Parse(os.Args[1:]))

if *verbose {
fmt.Println("Verbose mode enabled")
} else {
fmt.Println("Verbose mode disabled")
}
}

运行示例:

./bool-flag --verbose
./bool-flag -v

3.6 解析列表参数

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

func main() {
app := kingpin.New("list-example", "解析列表参数示例。")
items := app.Flag("items", "输入多个项。").Strings()

kingpin.MustParse(app.Parse(os.Args[1:]))

fmt.Println("Items:", *items)
}

运行示例:

./list-example --items=apple --items=banana --items=cherry

4. 其他高级用法

4.1 自定义解析器

可以使用 kingpin.Action() 在解析参数后执行特定逻辑。

package main

import (
"fmt"
"os"
"github.com/alecthomas/kingpin"
)

func main() {
app := kingpin.New("custom-action", "示例:使用自定义解析逻辑。")
name := app.Flag("name", "输入你的名字。").String()

app.Action(func(c *kingpin.ParseContext) error {
fmt.Println("解析完成,欢迎", *name)
return nil
})

kingpin.MustParse(app.Parse(os.Args[1:]))
}

5. 总结

kingpin 提供了一种简单易用且功能强大的命令行解析方式,适用于各种 CLI 应用。

特点总结

✅ 支持子命令 ✅ 支持环境变量 ✅ 友好的 API 设计 ✅ 丰富的参数类型支持 ✅ 自动生成帮助文档

如果需要构建复杂的命令行工具,kingpin 是一个值得推荐的选择。