golang轻量级无依赖命令行工具开发插件库clîr的使用

Golang轻量级无依赖命令行工具开发插件库clîr的使用

clir_logo

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)
	}
}

这个更复杂的示例展示了如何:

  1. 创建带有子命令的CLI应用
  2. 添加全局标志(verbose)
  3. 为子命令添加专用标志
  4. 根据标志值改变程序行为

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命令行工具的无依赖库,它提供了:

  1. 简单的命令和子命令创建
  2. 多种参数类型支持
  3. 内置帮助系统
  4. 基本的颜色输出
  5. 简洁直观的API

对于不需要复杂功能的中小型命令行工具,clîr是一个很好的选择。它避免了像Cobra这样的重型库的复杂性,同时提供了足够的功能来构建实用的命令行应用。

要了解更多高级用法,可以参考clîr的GitHub仓库和文档。

回到顶部