为什么80%的码农都做不了架构师?>>>
命令行程序
go 编写命令行程序
使用 urfave/cli 这个库来编写自己的命令行程序
安装
go get github.com/urfave/cli
将GOPATH/bin
这个目录添加到本机的PATH
目录下
export PATH=$PATH:$GOPATH/bin
例子 (可以查看对应的git)
package main
import (
"os"
"github.com/urfave/cli"
)
func main() {
cli.NewApp().Run(os.Args)
}
下面这个复杂一点
package main
import (
"os"
"fmt"
"github.com/urfave/cli"
)
func main() {
var language string
app := cli.NewApp()
app.Flags = []cli.Flag {
cli.StringFlag{
Name: "lang, l",
Value: "english",
Usage: "language for the greeting",
Destination: &language,
},
}
app.Action = func(c *cli.Context) error {
name := "someone"
if c.NArg() > 0 {
name = c.Args()[0]
}
if language == "spanish" {
fmt.Println("Hola", name)
} else {
fmt.Println("Hello", name)
}
return nil
}
app.Run(os.Args)
}
这个在命令里可以敲的有
go run testcli.go
go run testcli.go help
go run testcli.go --lang spanish //Hola someone
go run testcli.go -l spanish
go run testcli.go -v
解析
App
使用这个包首先需要先创建一个app
app := cli.NewApp()
这个命令程序的基础是基于app这个东西的,在上面可以设置很多在hlep中可以看到的东西
下面测试设置一些,详细可以godoc app
package main
import (
"github.com/urfave/cli"
"os"
"fmt"
)
func checkerr(err error) {
if err != nil {
fmt.Printf("Error:%+v\n", err)
os.Exit(-1)
}
}
func main() {
app := cli.NewApp()
app.Version = "1.0.0"
app.Name = "app名字"
app.Usage = "app描述"
app.UsageText = "描述文本的详细信息,如果没有就是"
app.ArgsUsage = "参数的描述"
app.Email = "[email protected]"
app.Author = "用户名"
//这个方法就是这个命令已启动会运行什么
app.Action = func(c *cli.Context) error {
err := cli.ShowAppHelp(c) //这个是打印app的help界面
checkerr(err)
return nil
}
app.Run(os.Args)
}
修改help 显示的格式
一共可以修改3中help显示方式,
- App: cli.AppHelpTemplate
- Command : cli.CommandHelpTemplate
- Subcommand : cli.SubcommandHelpTemplate
cli.HelpPrinter 这个是最后输出的方法。改了这个那么模板就不起作用了 只会输出修改后的内容
package main
import (
"fmt"
"io"
"os"
"github.com/urfave/cli"
)
func main() {
// EXAMPLE: Append to an existing template
cli.AppHelpTemplate = fmt.Sprintf(`%s
WEBSITE: http://awesometown.example.com
SUPPORT: [email protected]
`, cli.AppHelpTemplate)
// EXAMPLE: Override a template
cli.AppHelpTemplate = `NAME:
{{.Name}} - {{.Usage}}
USAGE:
{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}
{{if len .Authors}}
AUTHOR:
{{range .Authors}}{{ . }}{{end}}
{{end}}{{if .Commands}}
COMMANDS:
{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}}
GLOBAL OPTIONS:
{{range .VisibleFlags}}{{.}}
{{end}}{{end}}{{if .Copyright }}
COPYRIGHT:
{{.Copyright}}
{{end}}{{if .Version}}
VERSION:
{{.Version}}
{{end}}
`
// EXAMPLE: Replace the `HelpPrinter` func
cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) {
fmt.Println("Ha HA. I pwnd the help!!1")
}
cli.NewApp().Run(os.Args)
}
参考
urfave/cli
go语言的命令行库
PS: 觉得不错的请点个赞吧!! (ง •̀_•́)ง