你的首个 CLI app
从这里开始
tiny1 Example
在 tiny0 示例 中已经展示了极简的 cmdr-based app 的编写。但那只是玩具,接下来的几个小节我们依次介绍更为真实的用法。
同样地,本例中不做标准的集成,简单地、但是代码结构组织得更合理一些,如下所示,
package main
import (
"context"
"os"
"github.com/hedzr/cmdr/v2"
"github.com/hedzr/cmdr/v2/cli"
)
func main() {
ctx := context.Background() // with cancel can be passed thru in your actions
app := prepareApp(ctx)
if err := app.Run(ctx); err != nil {
println("Application Error:", err)
os.Exit(app.SuggestRetCode())
}
}
func prepareApp(ctx context.Context, opts ...cli.Opt) (app cli.App) {
app = cmdr.New(opts...).
Info("tiny1-app", "0.3.1").
Author("The Example Authors") // .Description(``).Header(``).Footer(``)
app.Cmd("jump").
Description("jump command").
Examples(`jump example`). // {{.AppName}}, {{.AppVersion}}, {{.DadCommands}}, {{.Commands}}, ...
OnAction(func(ctx context.Context, cmd cli.Cmd, args []string) (err error) {
println("jump command:", cmd)
if cmd.FlagBy("full").GetTriggeredTimes() > 0 {
// for dummy store, `if cmd.Store().MustBool("full") {}` cannot work
println("Dump", cmd.Set().Dump()) // nothing to display since a dummy store created
}
return
}).
With(func(b cli.CommandBuilder) {
b.Flg("full", "f").
Default(false).
Description("full option here").
Build()
})
return
}
-- go.mod --
module tiny1这个微型 app 很简单,没有集成 Store 存储应用程序设置, 也没有集成外部设置装载器。
它包含一个子命令 jump,相应的业务逻辑处理程序由 OnAction 指定。因此,运行它会得到(类似于):
$ go run ./examples/tiny1 jump
jump command: (0x10140a4a0,0x140001ae6c8)其他部分和 tiny0 是没有区别的,故而不再解说。
额外的话题
为你的应用程序创建一条子命令可以使用的有两种序列:app/b.Cmd("long","short",...)...Build() 和 app/b.Cmd("long","short",...)...With(cb)。
前者使用 Build() 结束创建者模式。
后者能够带有一个回调函数闭包。这样你就能在闭包中继续创建更嵌套的下一级子命令了。
创建一个选项参数(Flag)的方式也是类似的,app/b.Flag("long","short",...)...Build() 和 app/b.Flag("long","short",...)...With(cb)。
其中,后者可以用于在闭包中设置 flag 的其他属性。不过,既然 Flag 不存在带有子命令的可能性,所以你也无法在这个闭包中“创建”子命令,那是无意义且不被它的 FlagBuilder 所支持的。
下一步
What is Next?
How is this guide?
最后更新于