共计 6538 个字符,预计需要花费 17 分钟才能阅读完成。
通过利用 cli 库能够在程序中像执行 cmd 命令一样运行可执行文件,同时也能够通过 --help
执行的帮忙阐明。
最简略的利用
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{
Name: "greet",
Usage: "fight the loneliness!",
Action: func(*cli.Context) error {fmt.Println("Hello friend!")
return nil
},
}
if err := app.Run(os.Args); err != nil {log.Fatal(err)
}
}
下面代码编译后,会生成对应的可执行文件(Name 与 App 的参数 Name 并没有强制关联,但最好保持一致)。在无参数执行可执行文件时,会执行对应 app 的 Action。上述代码就会打印出Hello friend
cli 最次要的几个参数是:Arguments、Flag、Command。这三个就像 linux 命令(或 cmd 命令)一样,给同一个应用程序通过传入不同的参数来执行不同的逻辑。
Args
app := &cli.App{Action: func(cCtx *cli.Context) error {fmt.Printf("Hello %q", cCtx.Args().Get(0))
return nil
},
}
通过 cCTX.Args().Get(参数索引)
获取具体的参数。
Flag
package main
import (
"fmt"
"log"
"os"
"github.com/urfave/cli/v2"
)
func main() {
app := &cli.App{Flags: []cli.Flag{
&cli.StringFlag{
Name: "lang",
Value: "english",
Usage: "language for the greeting",
},
},
Action: func(cCtx *cli.Context) error {
name := "Nefertiti"
if cCtx.NArg() > 0 {name = cCtx.Args().Get(0)
}
if cCtx.String("lang") == "spanish" {fmt.Println("Hola", name)
} else {fmt.Println("Hello", name)
}
return nil
},
}
if err := app.Run(os.Args); err != nil {log.Fatal(err)
}
}
对于上述代码执行编译和装置(之后的代码批改后都须要从新执行,前面省略此步骤,”cliTest/greet” 为我的项目目录,细节自查 go install 命令的应用)
go install cliTest/greet
上述文件执行实现之后会生成可执行文件(windows 留神文件所在目录退出到环境变量 path 中)
执行 greet --help
显示如下:
NAME:
greet - A new cli application
USAGE:
greet [global options] command [command options] [arguments...]
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--lang value language for the greeting (default: "english")
--help, -h show help
能够看到内容次要蕴含:
NAME
: 利用名字及阐明
USAGE
: 利用的用法及格局
COMMANDS
:以后利用反对的命令(目前只有 help)
GLOBAL OPTIONS
: 以后利用反对的可选参数
执行 greet --lang spanish eric
,输入Hola eric
,因为通过--lang
选项咱们设置了语言为 spanish,在前面的执行中同样依据 lang
选项执行了不同的逻辑。
执行 greet --lang english eric
和greet eric
,都输入了Hello eric
,这是因为在 lang 定义的时候设置了默认值Value:"english"
。
Flag 中各个参数的含意
Name
(string): 选项的名称,通常由一个或多个字符组成,能够在命令行中应用来指定该选项。Aliases
([]string): 选项的别名或代替名称列表。这些是可选的,用于提供更多的办法来指定雷同的选项。Usage
(string): 选项的简短形容,用于帮忙音讯和命令行帮忙文档中解释选项的用处。Value
(Value): 示意选项的值的接口类型。这通常是一个指向变量的指针,用于存储选项的值。DefValue
(string): 选项的默认值,以字符串模式示意。如果用户没有提供选项的值,将应用此默认值。EnvVar
(string): 选项的环境变量名。如果设置,能够通过环境变量来提供选项的值。FilePath
(string): 选项值示意文件门路时,用于将相对路径解释为绝对路径的根本门路。Required
(bool): 如果为 true,示意选项是必须的,用户必须提供一个值。否则,它是可选的。Hidden
(bool): 如果为 true,示意选项在帮忙音讯中不可见,通常用于暗藏高级或不罕用的选项。NoOptDefVal
(bool): 如果为 true,示意选项的默认值不会在帮忙音讯中显示,用于暗藏默认值。HasBeenSet
(bool): 用于示意用户是否为该选项提供了值。通常在命令执行时查看此字段。PlaceHolder
(string): 用于在帮忙音讯中指定选项值的占位符,以帮忙用户了解如何提供值。Category
(string): 用于将选项分组到特定的类别,以便更好地组织和显示帮忙音讯。HasBeenSetExplicitly
(bool): 用于示意用户是否显式设置了选项的值,以便辨别用户提供的值和默认值。CustomStringVar
(cli.CustomStringVar): 用于提供自定义的字符串值处理函数,用于解决选项的字符串值。
罕用的 Flag 类型
-
cli.StringFlag:用于接管字符串值的选项。例如:
goCopy code cli.StringFlag{ Name: "config, c", Usage: "Load configuration from `FILE`", }
-
cli.IntFlag:用于接管整数值的选项。例如:
goCopy code cli.IntFlag{ Name: "port, p", Usage: "Listen on `PORT`", }
-
cli.BoolFlag:用于接管布尔值(true 或 false)的选项。通常用于标识性选项。例如:
goCopy code cli.BoolFlag{ Name: "verbose, v", Usage: "Enable verbose mode", }
-
cli.Float64Flag:用于接管浮点数值的选项。例如:
goCopy code cli.Float64Flag{ Name: "threshold, t", Usage: "Set the threshold value", }
-
cli.StringSliceFlag:用于接管多个字符串值的选项,返回一个字符串切片。例如:
goCopy code cli.StringSliceFlag{ Name: "tags", Usage: "Add one or more tags", }
-
cli.GenericFlag:用于自定义类型的选项,须要实现
cli.Generic
接口。能够用于解决非标准选项类型。例如:goCopy code cli.GenericFlag{ Name: "myflag", Value: &MyCustomType{}, // MyCustomType 须要实现 cli.Generic 接口 Usage: "Custom flag", }
这些是一些常见的 cli.Flag
类型,您能够依据须要抉择适当的类型来定义您的命令行选项。不同的类型容许您承受不同类型的值,并提供了相应的办法来解析和解决这些值。您还能够创立自定义的 cli.Flag
类型来解决特定需要。Flag 的类型有很多,具体的参考 cli 官网文档
Command
像下面的代码,咱们自身只存在一个 App,同时执行此 app 会执行器 Action 办法,如果心愿一个 App 中能够定义多个 Action 办法,能够引入 Command。同时 Command 还反对定义 SubCommand,能够对性能进行更细化的辨别。
app := &cli.App{Commands: []*cli.Command{
{
Name: "add",
Aliases: []string{"a"},
Usage: "add a task to the list",
Action: func(cCtx *cli.Context) error {fmt.Println("added task:", cCtx.Args().First())
return nil
},
},
{
Name: "complete",
Aliases: []string{"c"},
Usage: "complete a task on the list",
Action: func(cCtx *cli.Context) error {fmt.Println("completed task:", cCtx.Args().First())
return nil
},
},
{
Name: "template",
Aliases: []string{"t"},
Usage: "options for task templates",
Subcommands: []*cli.Command{
{
Name: "add",
Usage: "add a new template",
Action: func(cCtx *cli.Context) error {fmt.Println("new task template:", cCtx.Args().First())
return nil
},
},
{
Name: "remove",
Usage: "remove an existing template",
Action: func(cCtx *cli.Context) error {fmt.Println("removed task template:", cCtx.Args().First())
return nil
},
},
},
},
},
}
if err := app.Run(os.Args); err != nil {log.Fatal(err)
}
greet --help
显示:
COMMANDS:
add, a add a task to the list
complete, c complete a task on the list
template, t options for task templates
help, h Shows a list of commands or help for one command
能够看到以后蕴含的所有命令。但并没有显示 template
命令的子命令,咱们能够通过 greet template --help
查看 template 命令的帮忙文档
NAME:
greet template - options for task templates
USAGE:
greet template command [command options] [arguments...]
COMMANDS:
add add a new template
remove remove an existing template
help, h Shows a list of commands or help for one command
命令的排序
通过在代码中 app.Run 之前调用 sort.Sort(cli.CommandsByName(app.Commands))
能够对命令按名字排序。
命令的分类
同级的命令中能够通过减少 Category
对命令进行分类(同类命令在展现时会再一个类下显示)。
例如:
Commands: []*cli.Command{
{
Name: "add",
Aliases: []string{"a"},
Category: "C1",
Usage: "add a task to the list",
Action: func(cCtx *cli.Context) error {fmt.Println("added task:", cCtx.Args().First())
return nil
},
},
{
Name: "complete",
Aliases: []string{"c"},
Category: "C1",
Usage: "complete a task on the list",
Action: func(cCtx *cli.Context) error {fmt.Println("completed task:", cCtx.Args().First())
return nil
},
},
--help
显示
COMMANDS:
template, t options for task templates
help, h Shows a list of commands or help for one command
C1:
add, a add a task to the list
complete, c complete a task on the list
Comand 中各个参数的作用
Name
(字符串):命令的名称。用于从命令行中调用该命令。Aliases
([]字符串):命令的别名或代替名称列表。能够用作调用雷同命令的代替形式。Usage
(字符串):命令的简短形容,用于阐明命令的用处或性能。通常在命令行帮忙音讯中显示。UsageText
(字符串):在帮忙音讯的 USAGE 局部显示的自定义文本。可在此处提供额定的应用阐明。Description
(字符串):命令如何工作的具体解释。提供了无关命令性能的更详细信息。ArgsUsage
(字符串):对该命令预期的参数的简要形容。帮忙用户理解应该提供哪些参数。Category
(字符串):命令所属的类别。可用于组织和分组相干命令。BashComplete
(BashCompleteFunc):用于查看 bash 命令实现时调用的函数。用于命令行主动实现。Before
(BeforeFunc):在运行任何子命令之前但在上下文筹备好后执行的操作。如果返回非 nil 谬误,则不运行任何子命令。After
(AfterFunc):在运行任何子命令之后但子命令实现后执行的操作。即便Action()
恐慌,也会运行它。Action
(ActionFunc):在调用该命令时要调用的次要函数。在这里定义命令的行为。OnUsageError
(OnUsageErrorFunc):如果产生应用谬误(如不正确的命令行参数或标记),则执行此函数。Subcommands
([]*Command):子命令的列表。您能够在父命令下创立子命令的层次结构。Flags
([]Flag):要解析的标记列表。标记用于传递选项和参数给命令。SkipFlagParsing
(布尔):如果为 true,则将所有标记视为一般参数。可用于禁用特定命令的主动标记解析。HideHelp
(布尔):如果为 true,则暗藏内置的帮忙命令和帮忙标记。HideHelpCommand
(布尔):如果为 true,则暗藏内置的帮忙命令,但保留帮忙标记。如果HideHelp
为 true,则疏忽此选项。Hidden
(布尔):如果为 true,则从帮忙或实现中暗藏该命令。这使得该命令在帮忙音讯中不可见。UseShortOptionHandling
(布尔):如果为 true,则启用短选项解决,使用户可能将多个单字符布尔参数组合成一个参数(例如,-ov
)。HelpName
(字符串):用于帮忙的命令的全名。默认为残缺命令名称,包含父命令。CustomHelpTemplate
(字符串):命令的帮忙主题的文本模板。您能够通过设置此变量来提供自定义帮忙文本。categories
(CommandCategories):蕴含已分类命令的构造,在应用程序启动时填充。isRoot
(布尔):批示是否为根 “ 非凡 ” 命令。separator
(separatorSpec):用于分隔参数的分隔符配置。