docopt/docopt.go

GitHub: docopt/docopt.go

docopt-go 通过直接解析帮助信息文本来自动生成命令行参数解析逻辑,让 Go 开发者无需手写解析器即可构建优雅的 CLI 工具。

Stars: 1443 | Forks: 104

# docopt-go [![Build Status](https://travis-ci.org/docopt/docopt.go.svg?branch=master)](https://travis-ci.org/docopt/docopt.go) [![Coverage Status](https://coveralls.io/repos/github/docopt/docopt.go/badge.svg)](https://coveralls.io/github/docopt/docopt.go) [![GoDoc](https://godoc.org/github.com/docopt/docopt.go?status.svg)](https://godoc.org/github.com/docopt/docopt.go) [docopt](http://docopt.org/) 的 [Go](http://golang.org/) 语言实现。 **docopt** 帮助您轻松创建*美观的*命令行界面: ``` package main import ( "fmt" "github.com/docopt/docopt-go" ) func main() { usage := `Naval Fate. Usage: naval_fate ship new ... naval_fate ship move [--speed=] naval_fate ship shoot naval_fate mine (set|remove) [--moored|--drifting] naval_fate -h | --help naval_fate --version Options: -h --help Show this screen. --version Show version. --speed= Speed in knots [default: 10]. --moored Moored (anchored) mine. --drifting Drifting mine.` arguments, _ := docopt.ParseDoc(usage) fmt.Println(arguments) } ``` **docopt** 会根据帮助信息来解析命令行参数。无需编写解析器代码:一份优秀的帮助信息中已经包含了所有必要的信息。 ## 安装 ⚠ 请使用别名 "docopt-go"。要在您的 Go 代码中使用 docopt: ``` import "github.com/docopt/docopt-go" ``` 要在您的 `$GOPATH` 中安装 docopt: ``` $ go get github.com/docopt/docopt-go ``` ## API 给定一个常规的命令行帮助信息,docopt 就会处理相应的参数。有关帮助信息格式的说明,请参阅 https://github.com/docopt/docopt#help-message-format。 根据所需的控制程度,该包提供了三种不同的 API。首先,解析 docopt 用法最简单的方式就是直接调用: ``` docopt.ParseDoc(usage) ``` 这将使用 `os.Args[1:]` 作为 argv 切片,并使用默认的解析器选项。如果您想提供自己的版本字符串和参数,请使用: ``` docopt.ParseArgs(usage, argv, "1.2.3") ``` 如果最后一个参数 (version) 是一个非空字符串,当 argv 切片中传入 `--version` 时,将会打印该字符串。最后,我们可以实例化自己的 `docopt.Parser`,从而控制诸如帮助信息的打印方式,以及显示用法信息后是否退出等行为。 ``` parser := &docopt.Parser{ HelpHandler: docopt.PrintHelpOnly, OptionsFirst: true, } opts, err := parser.ParseArgs(usage, argv, "") ``` 特别是,设置您自己的自定义 `HelpHandler` 函数,会让您使用示例命令行调用来对文档进行单元测试变得轻松愉快。 这三种方式都将返回一个将选项名称映射到从 argv 解析出的值的 map,以及一个 error 或 nil。您可以使用辅助函数获取这些值,或者直接将其视为常规的 map: ``` flag, _ := opts.Bool("--flag") secs, _ := opts.Int("") ``` 此外,您可以将其 `Bind` 到一个结构体,一次性地将选项值赋给该结构体的导出字段。 ``` var config struct { Command string `docopt:""` Tries int `docopt:"-n"` Force bool // Gets the value of --force } opts.Bind(&config) ``` 更多文档可在 [godoc.org](https://godoc.org/github.com/docopt/docopt-go) 中查看。 ## 单元测试 建议对您的用法文档进行单元测试,这样您就能确保对于给定的命令行调用,能够设置预期的选项。有关如何执行此操作的示例,请参阅 [examples 文件夹](examples/unit_test/unit_test.go)。 ## 测试 Python 版本的所有测试均已实现,并在 [Travis CI](https://travis-ci.org/docopt/docopt-go) 上通过。新的语言无关测试已添加到 [test_golang.docopt](test_golang.docopt) 中。 要运行 docopt-go 的测试,请使用 `go test`。
标签:docopt, EVTX分析, Go, Ruby工具, 参数解析, 开发库, 日志审计