golang构建命令行应用的简单高效插件库urfave/cli的使用

Golang构建命令行应用的简单高效插件库urfave/cli的使用

介绍

urfave/cli 是一个声明式、简单、快速且有趣的Go包,用于构建命令行工具,具有以下特点:

  • 支持命令和子命令,包括别名和前缀匹配
  • 灵活且宽松的帮助系统
  • 支持bash、zsh、fish和powershell的动态shell补全
  • 除了Go标准库外没有其他依赖
  • 支持简单类型、简单类型切片、时间、持续时间等的输入标志
  • 支持复合短标志(-a -b -c可以简写为-abc)
  • 支持生成man和Markdown格式的文档
  • 支持从以下来源获取输入:
    • 环境变量
    • 纯文本文件
    • 结构化文件格式

示例代码

下面是一个完整的urfave/cli使用示例:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/urfave/cli/v2"
)

func main() {
	// 创建一个新的cli应用
	app := &cli.App{
		Name:  "greet",  // 应用名称
		Usage: "fight the loneliness!",  // 应用用途描述
		// 定义应用的命令
		Commands: []*cli.Command{
			{
				Name:    "hello",  // 命令名称
				Aliases: []string{"h"},  // 命令别名
				Usage:   "say hello to someone",  // 命令用途
				// 命令的标志
				Flags: []cli.Flag{
					&cli.StringFlag{
						Name:    "name",  // 标志名称
						Aliases: []string{"n"},  // 标志别名
						Value:   "World",  // 默认值
						Usage:   "who to say hello to",  // 标志用途
					},
				},
				// 命令执行函数
				Action: func(c *cli.Context) error {
					name := c.String("name")  // 获取name标志的值
					fmt.Printf("Hello %s!\n", name)
					return nil
				},
			},
			{
				Name:    "goodbye",  // 命令名称
				Aliases: []string{"g"},  // 命令别名
				Usage:   "say goodbye to someone",  // 命令用途
				// 命令的标志
				Flags: []cli.Flag{
					&cli.StringFlag{
						Name:    "name",  // 标志名称
						Aliases: []string{"n"},  // 标志别名
						Value:   "World",  // 默认值
						Usage:   "who to say goodbye to",  // 标志用途
					},
				},
				// 命令执行函数
				Action: func(c *cli.Context) error {
					name := c.String("name")  // 获取name标志的值
					fmt.Printf("Goodbye %s!\n", name)
					return nil
				},
			},
		},
	}

	// 运行应用
	err := app.Run(os.Args)
	if err != nil {
		log.Fatal(err)
	}
}

使用说明

  1. 首先安装urfave/cli包:
go get github.com/urfave/cli/v2
  1. 编译并运行上面的示例代码:
go build -o greet
  1. 使用示例:
# 查看帮助
./greet --help

# 使用hello命令
./greet hello --name John
# 或使用别名
./greet h -n John

# 使用goodbye命令
./greet goodbye --name Jane
# 或使用别名
./greet g -n Jane

更多功能

urfave/cli还支持许多其他功能,如:

  • 子命令嵌套
  • 环境变量自动绑定
  • 自定义帮助模板
  • 命令前的钩子和命令后的钩子
  • 自定义错误处理

如需了解更多详细信息和高级用法,请参考官方文档。


更多关于golang构建命令行应用的简单高效插件库urfave/cli的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang构建命令行应用的简单高效插件库urfave/cli的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


urfave/cli - Golang命令行应用构建利器

urfave/cli(原codegangsta/cli)是Go语言中一个简单高效的命令行应用构建库,它提供了创建功能丰富的命令行工具所需的一切功能。下面我将详细介绍其核心用法和示例。

基础用法

安装

go get github.com/urfave/cli/v2

最小示例

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/urfave/cli/v2"
)

func main() {
	app := &cli.App{
		Name:  "greet",
		Usage: "fight the loneliness!",
		Action: func(c *cli.Context) error {
			fmt.Println("Hello friend!")
			return nil
		},
	}

	if err := app.Run(os.Args); err != nil {
		log.Fatal(err)
	}
}

核心功能

1. 命令和子命令

app := &cli.App{
	Commands: []*cli.Command{
		{
			Name:    "add",
			Aliases: []string{"a"},
			Usage:   "add a task to the list",
			Action: func(c *cli.Context) error {
				fmt.Println("added task: ", c.Args().First())
				return nil
			},
		},
		{
			Name:    "complete",
			Aliases: []string{"c"},
			Usage:   "complete a task on the list",
			Action: func(c *cli.Context) error {
				fmt.Println("completed task: ", c.Args().First())
				return nil
			},
		},
	},
}

2. 标志(Flag)参数

app := &cli.App{
	Flags: []cli.Flag{
		&cli.StringFlag{
			Name:    "lang",
			Value:   "english",
			Usage:   "language for the greeting",
			Aliases: []string{"l"},
		},
		&cli.IntFlag{
			Name:    "count",
			Value:   1,
			Usage:   "number of greetings",
			Aliases: []string{"c"},
		},
	},
	Action: func(c *cli.Context) error {
		for i := 0; i < c.Int("count"); i++ {
			if c.String("lang") == "spanish" {
				fmt.Println("Hola", c.Args().First())
			} else {
				fmt.Println("Hello", c.Args().First())
			}
		}
		return nil
	},
}

3. 环境变量支持

&cli.StringFlag{
	Name:    "config",
	EnvVars: []string{"APP_CONFIG", "CONFIG_PATH"},
	Usage:   "config file path",
}

4. 版本和帮助信息

app := &cli.App{
	Name:    "todo",
	Version: "v1.0.0",
	Usage:   "A simple todo application",
	// 其他配置...
}

高级特性

1. Bash自动补全

app := &cli.App{
	EnableBashCompletion: true,
	// 其他配置...
}

2. 命令分类

app := &cli.App{
	Commands: []*cli.Command{
		{
			Name:     "add",
			Category: "task",
			// 其他配置...
		},
		{
			Name:     "remove",
			Category: "task",
			// 其他配置...
		},
	},
}

3. 错误处理

app := &cli.App{
	ExitErrHandler: func(c *cli.Context, err error) {
		if err != nil {
			fmt.Printf("Error: %v\n", err)
			cli.ShowAppHelp(c)
			os.Exit(1)
		}
	},
	// 其他配置...
}

完整示例

下面是一个完整的TODO应用示例:

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/urfave/cli/v2"
)

func main() {
	app := &cli.App{
		Name:     "todo",
		Usage:    "A simple todo application",
		Version:  "v1.0.0",
		Compiled: time.Now(),
		Authors: []*cli.Author{
			{
				Name:  "Your Name",
				Email: "you@example.com",
			},
		},
		Flags: []cli.Flag{
			&cli.StringFlag{
				Name:    "config",
				Aliases: []string{"c"},
				Usage:   "Load configuration from `FILE`",
			},
		},
		Commands: []*cli.Command{
			{
				Name:    "add",
				Aliases: []string{"a"},
				Usage:   "add a task to the list",
				Action: func(c *cli.Context) error {
					fmt.Println("added task: ", c.Args().First())
					return nil
				},
			},
			{
				Name:    "complete",
				Aliases: []string{"c"},
				Usage:   "complete a task on the list",
				Action: func(c *cli.Context) error {
					fmt.Println("completed task: ", c.Args().First())
					return nil
				},
			},
			{
				Name:    "list",
				Aliases: []string{"l"},
				Usage:   "list all tasks",
				Action: func(c *cli.Context) error {
					fmt.Println("listing tasks...")
					return nil
				},
			},
		},
	}

	if err := app.Run(os.Args); err != nil {
		log.Fatal(err)
	}
}

最佳实践

  1. 组织代码:对于复杂应用,将不同命令的实现放在单独的文件中
  2. 错误处理:始终检查并妥善处理错误
  3. 测试:使用os.Args模拟命令行输入进行测试
  4. 文档:为每个命令和标志提供清晰的Usage信息
  5. 版本控制:使用Version字段方便用户检查版本

urfave/cli因其简洁的API和丰富的功能成为Go语言中最流行的命令行库之一,特别适合需要复杂命令行交互的应用开发。

回到顶部