hzDocs
hzDocs
文章 / 文档hedzr.com首页

cmdr series

介绍 cmdr

Guide

你的首个 CLI app更适合工程实践的版本
循序渐进
基本概念
命令命令:执行外部程序命令:预设参数命令:重定向命令:动态命令清单命令:在配置文件中定义别名清单命令:事件响应函数标志标志:必须项标志:可翻转组标志:枚举值标志:`Head -1` 风格标志:调用外部工具获得输入标志:自动否定标志:加号 `+` 前缀标志:事件响应函数解析结果内建命令和标志帮助子系统可共享共存的 app 实例辨析顶级函数WithOptsBackstage
如何……
Auto-close the ClosersRead config into structUsing is DetectorsUsing Store

References

What's New
Packages

Others

Examples
Blueprint
产品发布
产品发布之前
介绍 cmdr-cxx

Guide

cmdr supports

Intro

Guide

More features

References

Others

evendeep(-go)

Guide

Usagesdeepcopydeepdiffdeepequal
logg/slog(-go)

Guide

Guide

others

Components
trie-cxx

Guide

Guide

links

On Github

你的首个 CLI app

从这里开始

tiny1 Example

在 tiny0 示例 中已经展示了极简的 cmdr-based app 的编写。但那只是玩具,接下来的几个小节我们依次介绍更为真实的用法。

同样地,本例中不做标准的集成,简单地、但是代码结构组织得更合理一些,如下所示,

./examples/tiny1/main.go
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?

Components

Components

On Github

How is this guide?

最后更新于

目录

tiny1 Example
额外的话题
下一步