go 使用命令行库编写命令行程序

为什么80%的码农都做不了架构师?>>>   hot3.png

命令行程序

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)
}

go 使用命令行库编写命令行程序_第1张图片

修改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: 觉得不错的请点个赞吧!! (ง •̀_•́)ง

转载于:https://my.oschina.net/solate/blog/1186423

你可能感兴趣的:(go 使用命令行库编写命令行程序)