go开发cli程序

https://github.com/urfave/cli

V3版本

参考文档:https://cli.urfave.org/v3/getting-started/

初始化项目

mkdir mycliapp
cd mycliapp
go mod init mycliapp
go get github.com/urfave/cli/v3

命令基本格式

Shell 命令的基本格式为:command [options] [arguments]。其中 command 是命令名,options(选项)用于调节命令行为(通常以-或--开头),arguments(参数)是命令的操作对象(如文件或目录)。各部分由空格分隔,且严格区分大小写。

示例: ls -l /home

  • ls: 命令名称(列出目录内容)。
  • -l: 选项(长格式显示)。
  • /home: 参数(指定操作的目录)。

选项形式:

  • 短选项:使用单个字母,如 -a,可合并为 -la。
  • 长选项:使用完整单词,如 --all。

参数:值是字符串,一般可以支持位置参数和命名参数

  • 位置参数,例如cp -r sourcedirectory destinationdirectory递归复制,包含目录下的所有文件和子目录
  • 命名参数,一般形式是:命令 -参数名=参数值,或者使用空格进行分割:命令 -参数名 参数值
  • 混合位置参数和命名参数:位置参数和命名参数顺序任意
  • 其他的一些变体,例如:
java -Xmx2048m Main
java -Dproperty=value Main
java -agentlib:jdwp=transport=dt_socket,server=y,address=8000 Main

补充说明

  1. 空格分隔: 命令、选项、参数之间必须用一个或多个空格分隔。
  2. 可选部分: [] 表示该部分是可选的,非必须。很多命令也可以没有选项和参数
  3. 多命令连接: 使用 &&(前一条命令成功才执行下一条)或 ;(不管成功失败依次执行)连接多个命令。
  4. 帮助信息: 大多数命令可以通过 command --help 或 man command 查看具体用法。

使用方法

先来看个示例:

package main

import (
    "fmt"
    "log"
    "os"
    "context"
    "github.com/urfave/cli/v3"
)

func main() {
    cmd := &cli.Command{
        // 定义选项数组
        Flags: []cli.Flag{
            &cli.StringFlag{
                Name:  "lang",// 选项名称
                Value: "english", // 选项默认值
                Usage: "language for the greeting", // 描述信息
            },
        },
        // 命令执行的逻辑
        Action: func(ctx context.Context, cmd *cli.Command) error {
            // 参数个数
            count := cmd.NArg()
            count1 := cmd.Args().Len()
            // 参数数组
            args := cmd.Args()
            // 获取第几个参数值
            arg1 := cmd.Args().Get(0)
            // 获取lang的选项值
            lang := cmd.String("lang")
            return nil
        },
    }
    if err := cmd.Run(context.Background(), os.Args); err != nil {
        log.Fatal(err)
    }
}

编译后执行:.\mycliapp --lang zh-CN arg1_value arg2_value

子命令

参考:https://cli.urfave.org/v3/examples/subcommands/basics/

package main

import (
	"context"
	"fmt"
	"log"
	"os"

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

func main() {
	cmd := &cli.Command{
		Commands: []*cli.Command{
			{
				Name:    "add",
				Aliases: []string{"a"},
				Usage:   "add a task to the list",
				Action: func(ctx context.Context, cmd *cli.Command) error {
					fmt.Println("added task: ", cmd.Args().First())
					return nil
				},
			},
			{
				Name:    "complete",
				Aliases: []string{"c"},
				Usage:   "complete a task on the list",
				Action: func(ctx context.Context, cmd *cli.Command) error {
					fmt.Println("completed task: ", cmd.Args().First())
					return nil
				},
			},
			{
				Name:    "template",
				Aliases: []string{"t"},
				Usage:   "options for task templates",
				Commands: []*cli.Command{
					{
						Name:  "add",
						Usage: "add a new template",
						Action: func(ctx context.Context, cmd *cli.Command) error {
							fmt.Println("new task template: ", cmd.Args().First())
							return nil
						},
					},
					{
						Name:  "remove",
						Usage: "remove an existing template",
						Action: func(ctx context.Context, cmd *cli.Command) error {
							fmt.Println("removed task template: ", cmd.Args().First())
							return nil
						},
					},
				},
			},
		},
	}

	if err := cmd.Run(context.Background(), os.Args); err != nil {
		log.Fatal(err)
	}
}
posted @ 2025-12-27 09:15  vonlinee  阅读(17)  评论(0)    收藏  举报