美文网首页
Mix XCLI V1.1 - Go 命令行交互开发框架

Mix XCLI V1.1 - Go 命令行交互开发框架

作者: 撸代码的乡下人 | 来源:发表于2021-04-22 11:17 被阅读0次

    OpenMix 出品:https://openmix.org

    Mix XCLI

    命令行交互开发框架

    CLI Interactive Commander

    Overview

    一个命令行交互开发库,它可以让单个 CLI 程序可执行多个命令,同时它还包括命令行参数获取、全局 panic 捕获与处理、程序后台执行等命令行开发常用功能。

    Github

    https://github.com/mix-go/xcli

    Installation

    go get github.com/mix-go/xcli
    

    Quick start

    package main
    
    import (
        "github.com/mix-go/xcli"
        "github.com/mix-go/xcli/flag"
    )
    
    func main() {
        xcli.SetName("app").SetVersion("0.0.0-alpha")
        cmd := &xcli.Command{
            Name:  "hello",
            Short: "Echo demo",
            Run: func() {
                name := flag.Match("n", "name").String("default")
                // do something
            },
        }
        opt := &xcli.Option{
            Names: []string{"n", "name"},
            Usage: "Your name",
        }
        cmd.AddOption(opt)
        xcli.AddCommand(cmd).Run()
    }
    

    编译后,查看整个命令行程序的帮助

    $ ./go_build_main_go 
    Usage: ./go_build_main_go [OPTIONS] COMMAND [opt...]
    
    Commands:
      hello         Echo demo
    
    Global Options:
      -h, --help    Print usage
      -v, --version Print version information
    
    Run './go_build_main_go COMMAND --help' for more information on a command.
    
    Developed with Mix Go framework. (openmix.org/mix-go)
    

    查看命令行程序的版本信息

    $ ./go_build_main_go -v
    app 0.0.0-alpha, framework 1.0.9
    

    查看 hello 命令的帮助

    $ ./go_build_main_go hello --help
    Usage: ./go_build_main_go hello [opt...]
    
    Command Options:
      -n, --name    Your name
    
    Developed with Mix Go framework. (openmix.org/mix-go)
    

    执行 hello 命令

    $ ./go_build_main_go hello 
    

    Flag 参数获取

    该 flag 比 golang 自带的更加好用,不需要 Parse 操作

    参数规则 (部分UNIX风格+GNU风格)

    /examples/app home -d -rf --debug -v vvv --page 23 -s=test --name=john arg0
    
    • 命令:
      • 第一个参数,可以为空:home
    • 选项:
      • 短选项:一个中杠,如 -d-rf
      • 长选项:二个中杠,如:--debug
    • 选项值:
      • 无值:-d-rf--debug
      • 有值(空格):-v vvv--page 23
      • 有值(等号):-s=test--name=john
    • 参数:
      • 没有定义 - 的参数:arg0

    获取选项,可以获取 StringBoolInt64Float64 多种类型,也可以指定默认值。

    name := flag.Match("n", "name").String("Xiao Ming")
    

    获取第一个参数

    arg0 := flag.Arguments().First().String()
    

    获取全部参数

    for k, v := range flag.Arguments().Values() {
        // do something
    }
    

    Daemon 后台执行

    将命令行程序变为后台执行,该方法只可在 Main 协程中使用。

    process.Daemon()
    

    我们可以通过配合 flag 获取参数,实现通过某几个参数控制程序后台执行。

    if flag.Match("d", "daemon").Bool() {
        process.Daemon()
    }
    

    上面就实现了一个当命令行参数中带有 -d/--daemon 参数时,程序就在后台执行。

    Handle panic 错误处理

    h := func(next func()) {
        defer func() {
            if err := recover(); err != nil {
                // handle panic
            }
        }()
        next()
    }
    cmd := &xcli.Command{
        Name:  "hello",
        Short: "Echo demo",
        Run: func() {
            // do something
        },
    }
    xcli.Use(h).AddCommand(cmd).Run()
    

    Application

    我们在编写代码时,可能会要用到 App 中的一些信息。

    // 获取基础路径(二进制所在目录路径)
    xcli.App().BasePath
    
    // App名称
    xcli.App().Name
    
    // App版本号
    xcli.App().Version
    
    // 是否开启debug
    xcli.App().Debug
    

    Singleton 单命令

    当我们的 CLI 只有一个命令时,只需要配置一下 Singleton

    cmd := &xcli.Command{
        Name:  "hello",
        Short: "Echo demo",
        Run: func() {
            // do something
        },
        Singleton: true,
    }
    

    命令的 Options 将会在 -h/--help 中打印

    $ ./go_build_main_go 
    Usage: ./go_build_main_go [OPTIONS] COMMAND [opt...]
    
    Command Options:
      -n, --name    Your name
    
    Global Options:
      -h, --help    Print usage
      -v, --version Print version information
    
    Run './go_build_main_go --help' for more information on a command.
    
    Developed with Mix Go framework. (openmix.org/mix-go)
    

    Default 默认执行

    当我们的 CLI 有 CUI 时,需要实现点击后默认启动 UI 界面,只需要配置一下 Default

    cmd := &xcli.Command{
        Name:  "hello",
        Short: "Echo demo",
        Run: func() {
            // do something
        },
        Default: true,
    }
    

    License

    Apache License Version 2.0, http://www.apache.org/licenses/

    相关文章

      网友评论

          本文标题:Mix XCLI V1.1 - Go 命令行交互开发框架

          本文链接:https://www.haomeiwen.com/subject/ahmxrltx.html