基本介绍

命令行解析最主要的是针对于选项的解析, gcmd 组件提供了 Parse 方法,用于自定义解析选项,包括有哪些选项名称,每个选项是否带有数值。根据这一配置便可将所有的参数和选项进行解析归类。

命令管理-Parser解析 - 图1提示

大部分场景下,我们并不需要显式创建 Parser 对象,因为我们有层级管理以及对象管理方式来管理多命令。但底层仍然是采用 Parser 方式实现,因此本章节大家了解原理即可。

相关方法:

更多 Parser 方法请参考接口文档: https://pkg.go.dev/github.com/gogf/gf/v2/os/gcmd#Parser

  1. func Parse(supportedOptions map[string]bool, option ...ParserOption) (*Parser, error)
  2. func ParseWithArgs(args []string, supportedOptions map[string]bool, option ...ParserOption) (*Parser, error)
  3. func ParserFromCtx(ctx context.Context) *Parser
  4. func (p *Parser) GetArg(index int, def ...string) *gvar.Var
  5. func (p *Parser) GetArgAll() []string
  6. func (p *Parser) GetOpt(name string, def ...interface{}) *gvar.Var
  7. func (p *Parser) GetOptAll() map[string]string

其中, ParserOption 如下:

  1. // ParserOption manages the parsing options.
  2. type ParserOption struct {
  3. CaseSensitive bool // Marks options parsing in case-sensitive way.
  4. Strict bool // Whether stops parsing and returns error if invalid option passed.
  5. }

解析示例:

  1. parser, err := gcmd.Parse(g.MapStrBool{
  2. "n,name": true,
  3. "v,version": true,
  4. "a,arch": true,
  5. "o,os": true,
  6. "p,path": true,
  7. })

可以看到,选项输入参数其实是一个 map 类型。其中键值为选项名称,同一个选项的不同名称可以通过 , 符号进行分隔。比如,该示例中 nname 选项是同一个选项,当用户输入 -n john 的时候, nname 选项都会获得到数据 john

而键值是一个布尔类型,标识该选项是否需要解析参数。这一选项配置是非常重要的,因为有的选项是不需要获得数据的,仅仅作为一个标识。例如, -f force 这个输入,在需要解析数据的情况下,选项 f 的值为 force;而在不需要解析选项数据的情况下,其中的 force 便是命令行的一个参数,而不是选项。

使用示例

  1. func ExampleParse() {
  2. os.Args = []string{"gf", "build", "main.go", "-o=gf.exe", "-y"}
  3. p, err := gcmd.Parse(g.MapStrBool{
  4. "o,output": true,
  5. "y,yes": false,
  6. })
  7. if err != nil {
  8. panic(err)
  9. }
  10. fmt.Println(p.GetOpt("o"))
  11. fmt.Println(p.GetOpt("output"))
  12. fmt.Println(p.GetOpt("y") != nil)
  13. fmt.Println(p.GetOpt("yes") != nil)
  14. fmt.Println(p.GetOpt("none") != nil)
  15. // Output:
  16. // gf.exe
  17. // gf.exe
  18. // true
  19. // true
  20. // false
  21. }