介绍
golang cli 工具包
软件架构
golang 命令行 应用构建 工具包 在 github.com/urfave/cli/v2 基础扩展与简化
安装教程
$ go get gitee.com/nuokwan_backend_group/cli
使用说明
eg :+1
command.go
package examples import ( "fmt" "gitee.com/nuokwan_backend_group/cli/core" "gitee.com/nuokwan_backend_group/cli/resolver" "github.com/urfave/cli/v2" ) // 支持字符串命令参数表达式 解析 // @ : required // # : hidden // -- flag的 name // -x 表单对应flag 的别名 // 每个flag 表达式 有3 部分 // name : usage : default-value // name 部分包括 了 flag 类型定义 和 是否必选参标识 // 参数类型 使用 中括号包括 "[xxx]" // 参数类型 支持 string, number, float ,bool ,intArr // 每个 flag 使用换行符分隔 const ( VArgs = ` @[string]--config,-c: 配置文件路径 : file.txt [bool]--on : 是否开启 : false --version,-V,-ver : 显示版本号 : 0.0.1 ` VName = "version:test" VUsage = "输出版本帮助" VDescription = "描述" ) type VersionCommand struct { core.BaseCommander } func NewVersionCmd() *VersionCommand { return &VersionCommand{} } // 自动 载入相关信息 func (cmd *VersionCommand) Boot() { cmd.Command.Name = VName cmd.Command.Usage = VUsage cmd.Command.Description = VDescription flags := resolver.StrTemplateResolver(VArgs).Args() cmd.Command.Flags = flags } // 必须 实现 自动注册 func (cmd *VersionCommand) Register(app *core.CmdApp) { core.CommanderRegisterFn(cmd, app) } // 命令处理 func (cmd *VersionCommand) Handle(ctx *cli.Context) error { fmt.Printf("config:%s \n", ctx.String("config")) fmt.Printf("on:%v \n", ctx.Bool("on")) fmt.Printf("version:%v \n", ctx.String("version")) return nil }
main.go
package main import ( "fmt" "gitee.com/nuokwan_backend_group/cli/core" "gitee.com/nuokwan_backend_group/cli/examples" "github.com/urfave/cli/v2" "log" "os" ) func main() { app := core.NewCmdApp() cmd := examples.NewVersionCmd() cmd.Register(app) // 启动命令应用 app.Run() }
examples目录中有相关案例代码
其他功能
简单 命令 flag 封装 与 解析器
package examples import ( "fmt" "gitee.com/nuokwan_backend_group/cli/resolver" ) const ( FlagsExpress = ` [bool]--help : show help menus : false --conf : config file path : ./config.ini --name : set process name : cli [bool]--deamon : process run in background : true ` ) // SimpleCommanderApp 适用于需要简单命令行嵌入支持的应用 func GetCommander() *resolver.SimpleCommanderApp { // 设置启动时 需要注册 命令行参数 即可 resolver.SimpleCommandLine.BootHandler = func(app *resolver.SimpleCommanderApp) { // 支持字符串表达解析注册 (批量) app.AddFlagsByStrExpress(FlagsExpress) // 支持单条注册 [支持类型: string,int,float64,bool] app.AddFlag("string", "test","命令参数", "默认值") } return resolver.SimpleCommandLine } func GetArg() { app := GetCommander() app.Run() if app.GetBool("help") { app.PrintUsage() } else { fmt.Println(app.GetBool("deamon")) fmt.Println(app.Get("conf")) fmt.Println(app.Get("name")) fmt.Println(app.Get("test")) } }
以守护进程方式启动 或 杀死对应守护进程
package main import ( _ "gitee.com/nuokwan_backend_group/cli/daemon" "log" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/index", func(rw http.ResponseWriter, req *http.Request) { rw.Write([]byte("hello, golang!\n")) }) log.Fatalln(http.ListenAndServe(":7070", mux)) }
使用方式 :
$ go build -o web $ ./web -d=true --name=web # 后台启动 $ ./web --stop --name=web # 关闭进程
--name
[web] deamonOn=true ;; pid保存的文件路径 pidFile=web.pid
pidFile 也可在环境变量中指定(配置文件优先)
$ export Daemon.PidFile="web.pid" $ ./web -d=true --name=web
windows 启动后台常驻进程 plugin
为兼容 daemon 后台常驻功能 需要使用windows 后台服务注册
plugin 目录下win 中的 WinSw.exe 就是 windows 服务注册的工具
编辑 相关 配置 WinSw.xml 为对应 exe 即可
<service> <!--可执行二进制文件--> <executable>%BASE%\web.exe</executable> <!--启动相关参数--> <arguments></arguments> </service>
将 WinSW.exe 修改程 对应 应用名 配置也改程对应名 eg :
rename WinSw.exe Web-cli.exe cp WinSw.xml Web-cli.xml
然后 将cli、(xml)配置 和 可以执行文件 拷贝 到同一个文件目录下
:: 第一次,注册后台常驻进程服务 (install一次即可) Web-cli.exe install :: 启动服务 Web-cli.exe start :: 停止服务 Web-cli.exe stop
软件依赖
感谢🙏 开源工具包 urfave/cli/v2 感谢🙏 window开源工具包 winsw
github.com/mitchellh/mapstructure v1.2.2 github.com/urfave/cli/v2 v2.2.0