golang轻量级无依赖命令行工具开发插件库clîr的使用
Golang轻量级无依赖命令行工具开发插件库clîr的使用
clîr 是一个简单清晰的命令行界面库,完全无依赖。
特性
- 支持嵌套子命令
- 使用标准库
flag
包 - 基于结构体的标志
- 位置参数
- 自动生成帮助信息
- 自定义横幅
- 隐藏子命令
- 默认子命令
- 无依赖
示例代码
下面是一个完整的 clîr 使用示例:
package main
import (
"fmt"
"github.com/leaanthony/clir"
)
func main() {
// 创建新的CLI应用
cli := clir.NewCli("Flags", "A simple example", "v0.0.1")
// 定义字符串标志
name := "Anonymous"
cli.StringFlag("name", "Your name", &name)
// 定义命令执行动作
cli.Action(func() error {
fmt.Printf("Hello %s!\n", name)
return nil
})
// 运行CLI应用
if err := cli.Run(); err != nil {
fmt.Printf("Error encountered: %v\n", err)
}
}
生成的帮助信息
运行上面的程序并添加 --help
参数时,会显示以下帮助信息:
$ flags --help
Flags v0.0.1 - A simple example
Flags:
-help
Get help on the 'flags' command.
-name string
Your name
更复杂的示例
下面是一个包含子命令和更多功能的示例:
package main
import (
"fmt"
"os"
"github.com/leaanthony/clir"
)
func main() {
// 创建主命令
cli := clir.NewCli("app", "A more complex example", "v1.0.0")
// 添加全局标志
verbose := false
cli.BoolFlag("verbose", "Enable verbose output", &verbose)
// 创建子命令
greetCmd := cli.NewSubCommand("greet", "Greet someone")
// 子命令专用标志
name := "World"
greetCmd.StringFlag("name", "Name to greet", &name)
// 子命令动作
greetCmd.Action(func() error {
if verbose {
fmt.Println("Verbose mode enabled")
}
fmt.Printf("Hello, %s!\n", name)
return nil
})
// 另一个子命令
mathCmd := cli.NewSubCommand("math", "Do some math")
// 数学运算参数
var a, b int
mathCmd.IntFlag("a", "First number", &a)
mathCmd.IntFlag("b", "Second number", &b)
// 数学子命令动作
mathCmd.Action(func() error {
if verbose {
fmt.Println("Performing math operation...")
}
fmt.Printf("%d + %d = %d\n", a, b, a+b)
return nil
})
// 运行CLI
if err := cli.Run(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
这个更复杂的示例展示了如何:
- 创建带有子命令的CLI应用
- 添加全局标志(verbose)
- 为子命令添加专用标志
- 根据标志值改变程序行为
clîr 是一个轻量级但功能强大的库,非常适合开发各种命令行工具,从简单工具到复杂的多命令应用。
更多关于golang轻量级无依赖命令行工具开发插件库clîr的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang轻量级无依赖命令行工具开发插件库clîr的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级命令行工具开发:clîr库使用指南
clîr是一个轻量级的Golang命令行工具开发库,它无外部依赖,提供了简单直观的API来构建命令行应用。下面我将详细介绍如何使用clîr开发命令行工具。
安装clîr
go get github.com/leaanthony/clir
基础使用示例
package main
import (
"fmt"
"github.com/leaanthony/clir"
)
func main() {
// 创建新应用
cli := clir.NewCli("myapp", "一个简单的命令行工具", "v1.0.0")
// 添加默认命令
cli.Action(func() error {
fmt.Println("执行默认操作")
return nil
})
// 运行应用
if err := cli.Run(); err != nil {
fmt.Println("错误:", err)
}
}
添加子命令
func main() {
cli := clir.NewCli("myapp", "多命令示例", "v1.0.0")
// 添加greet命令
greetCmd := cli.NewSubCommand("greet", "打招呼")
greetCmd.Action(func() error {
fmt.Println("Hello, World!")
return nil
})
// 添加自定义参数
personalGreet := cli.NewSubCommand("personal", "个性化打招呼")
var name string
personalGreet.StringFlag("name", "你的名字", &name)
personalGreet.Action(func() error {
fmt.Printf("Hello, %s!\n", name)
return nil
})
cli.Run()
}
参数处理
clîr支持多种参数类型:
func main() {
cli := clir.NewCli("params", "参数处理示例", "v1.0.0")
// 字符串参数
var name string
cli.StringFlag("name", "用户名", &name)
// 整数参数
var age int
cli.IntFlag("age", "年龄", &age)
// 布尔参数
var verbose bool
cli.BoolFlag("verbose", "详细模式", &verbose)
cli.Action(func() error {
if verbose {
fmt.Printf("详细信息: 用户名=%s, 年龄=%d\n", name, age)
} else {
fmt.Printf("你好 %s!\n", name)
}
return nil
})
cli.Run()
}
高级功能
命令帮助定制
func main() {
cli := clir.NewCli("helpdemo", "帮助示例", "v1.0.0")
// 自定义帮助模板
cli.NewHelpCommand().Template(
`{{.Name}} - {{.Description}}
版本: {{.Version}}
用法:
{{.Name}} [命令] [参数]
命令:
{{range .Commands}} {{.Name | printf "%-10s"}} {{.Description}}
{{end}}
`)
cli.Run()
}
颜色输出
clîr内置了简单的颜色支持:
func main() {
cli := clir.NewCli("color", "颜色示例", "v1.0.0")
cli.Action(func() error {
fmt.Println(clir.Red("红色文本"))
fmt.Println(clir.Green("绿色文本"))
fmt.Println(clir.Blue("蓝色文本"))
fmt.Println(clir.Yellow("黄色文本"))
return nil
})
cli.Run()
}
实际应用示例:文件处理器
package main
import (
"fmt"
"os"
"github.com/leaanthony/clir"
)
func main() {
cli := clir.NewCli("fileproc", "文件处理工具", "v1.0.0")
// 统计文件行数
countCmd := cli.NewSubCommand("count", "统计文件行数")
var countFile string
countCmd.StringFlag("file", "要统计的文件", &countFile)
countCmd.Action(func() error {
content, err := os.ReadFile(countFile)
if err != nil {
return fmt.Errorf("无法读取文件: %v", err)
}
lines := 0
for _, b := range content {
if b == '\n' {
lines++
}
}
fmt.Printf("文件 %s 有 %d 行\n", countFile, lines)
return nil
})
// 搜索文本
searchCmd := cli.NewSubCommand("search", "在文件中搜索文本")
var searchFile, searchText string
searchCmd.StringFlag("file", "要搜索的文件", &searchFile)
searchCmd.StringFlag("text", "要搜索的文本", &searchText)
searchCmd.Action(func() error {
content, err := os.ReadFile(searchFile)
if err != nil {
return fmt.Errorf("无法读取文件: %v", err)
}
lines := strings.Split(string(content), "\n")
for i, line := range lines {
if strings.Contains(line, searchText) {
fmt.Printf("%d: %s\n", i+1, line)
}
}
return nil
})
if err := cli.Run(); err != nil {
fmt.Println("错误:", err)
os.Exit(1)
}
}
总结
clîr是一个非常适合快速开发Golang命令行工具的无依赖库,它提供了:
- 简单的命令和子命令创建
- 多种参数类型支持
- 内置帮助系统
- 基本的颜色输出
- 简洁直观的API
对于不需要复杂功能的中小型命令行工具,clîr是一个很好的选择。它避免了像Cobra这样的重型库的复杂性,同时提供了足够的功能来构建实用的命令行应用。
要了解更多高级用法,可以参考clîr的GitHub仓库和文档。