【问题标题】:Understanding subcommands with go-flags使用 go-flags 理解子命令
【发布时间】:2016-12-07 04:17:05
【问题描述】:

我正在构建一个 CLI 工具来开始学习一些 Go。我发现了这个流行的包,我想用它来执行一些类似这样的命令:

http://godoc.org/github.com/jessevdk/go-flags#Group
https://github.com/jessevdk/go-flags

ex list todos
ex list todos --completed
ex list events
ex list todos events
ex authenticate

我理解它的方式是 ex 将是我的主要命令。
listauthenticate 是子命令。

但在这种情况下,todosevents 是什么? --completed 是什么。 --completed 是否称为 Option?这是我看到的措辞,但不确定我是否正确阅读。我正在尝试找到一个示例,该示例具有针对这种情况的不同选项,但我找不到。

我尝试使用 urfave/cli,起初效果很好,直到我发现需要能够将多个实体传递给 ex list,例如 ex list todos events

【问题讨论】:

    标签: go


    【解决方案1】:

    我在多个项目中使用过 jessevdk/go-flags 并且非常喜欢它。文档很少,但代码很干净,因此可以在很多方面进行自我记录。

    我会尽力解决您的问题:

    ex 将是您的二进制文件,通常是所有顶级命令的“主”结构(例如https://github.com/concourse/fly/blob/master/commands/fly.go)。这将在您的主函数中解析(例如https://github.com/concourse/fly/blob/master/main.go)。

    todosevents 实际上是第一级子命令。您可以在第一级命令 (list) 上定义这些命令,就像在“主”命令结构上定义命令一样。

    --completed 确实是一种选择。

    一个在 Concourse CI CLI https://github.com/concourse/fly 中使用 go-flags 的开源项目示例。虽然它不像你想要的那样嵌套命令,但它为 go-flags 的使用提供了非常坚实的基础。

    【讨论】:

    • 第 50 行 fly.go 的底部,有var Fly FlyCommand。为什么需要这个?如果没有第 50 行的声明,你不能从另一个包中引用 FlyCommand 吗?
    • 是的,那是为FlyCommand 结构创建一个实际的“实例”,以便它可以填充值。您将在main() 函数中看到该变量的地址被传递给NewParser() 中的解析器。然后当Parse() 被调用时,go-flags 会通过命令/选项结构一直填充适当的字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2022-12-05
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多