go开发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
补充说明
- 空格分隔: 命令、选项、参数之间必须用一个或多个空格分隔。
- 可选部分: [] 表示该部分是可选的,非必须。很多命令也可以没有选项和参数
- 多命令连接: 使用 &&(前一条命令成功才执行下一条)或 ;(不管成功失败依次执行)连接多个命令。
- 帮助信息: 大多数命令可以通过 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)
}
}

浙公网安备 33010602011771号