docopt/docopt.go
GitHub: docopt/docopt.go
docopt-go 通过直接解析帮助信息文本来自动生成命令行参数解析逻辑,让 Go 开发者无需手写解析器即可构建优雅的 CLI 工具。
Stars: 1443 | Forks: 104
# docopt-go
[](https://travis-ci.org/docopt/docopt.go)
[](https://coveralls.io/github/docopt/docopt.go)
[](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工具, 参数解析, 开发库, 日志审计