1. 程式人生 > >golang開發:類庫篇(三)命令列工具cli的使用

golang開發:類庫篇(三)命令列工具cli的使用

為什麼要使用命令列

覺得這個問題不應該列出來,又覺得如果初次進行WEB開發的話,可能會覺得所有的東西都可以使用API去做,會覺得命令列沒有必要。
其實,一個生產的專案命令列是繞不過去的。比如運營需要匯出報表、統計下付費使用者、服務不穩定修改下訂單狀態等等,再者,命令列的工具基本都是內部使用,除錯日誌可以隨意點,退一萬步來說,即使有問題了,還可以再次修改。不像API是是隨機性的,有些業務發生錯誤和異常是隨機的、不可逆的。

怎麼使用cli

這個主要看下使用案例就一目瞭然了。
首先下載類庫包
go get github.com/urfave/cli
main.go

package main

import (
    "fmt"
    "os"
    "github.com/urfave/cli"
)

func main() {
    app := cli.NewApp()
    app.Commands = []cli.Command{
        {
            Name:  "test",
            Usage: "test --uid=x --username=y",
            Action: (&Command{}).Test,
            Flags: []cli.Flag{
                cli.IntFlag{Name: "uid",Usage:"--uid"},
                cli.StringFlag{Name:"username",Usage:"--username"},
            },
        },
    }
    err := app.Run(os.Args)
    if err != nil {
        fmt.Print("command error :" + err.Error())
    }
}

command.go

package main

import (
    "fmt"
    "github.com/urfave/cli"
)
type Command struct {
}

func (this *Command) Test(cli *cli.Context) {
    uid := cli.Int("uid")
    username := cli.String("username")
    fmt.Println(uid,username)
}

編譯執行

go build -o test.bin
./test.bin
NAME:
   test.bin - A new cli application

USAGE:
   test.bin [global options] command [command options] [arguments...]

VERSION:
   0.0.0

COMMANDS:
     test     test --uid=x --username=y
     help, h  Shows a list of commands or help for one command

執行命令看下結果

./test.bin  test --uid=110 --username=feixiang
110 feixiang

就是這麼簡單
可以再看看子命令

func main() {
    app := cli.NewApp()
    app.Commands = []cli.Command{
        {
            Name:  "test",
            Usage: "test1 --uid=x --username=y|test2 --uid=x --username=y",
            Subcommands:[]cli.Command{
                {
                    Name:  "test1",
                    Usage: "test1 --uid=x --username=y",
                    Action: (&Command{}).Test,
                    Flags: []cli.Flag{
                        cli.IntFlag{Name: "uid",Usage:"--uid"},
                        cli.StringFlag{Name:"username",Usage:"--username"},
                    },
                },
                {
                    Name:  "test2",
                    Usage: "test2 --uid=x --username=y",
                    Action: (&Command{}).Test,
                    Flags: []cli.Flag{
                        cli.IntFlag{Name: "uid",Usage:"--uid"},
                        cli.StringFlag{Name:"username",Usage:"--username"},
                    },
                },
            },
        },
    }
    err := app.Run(os.Args)
    if err != nil {
        fmt.Print("command error :" + err.Error())
    }
}

編譯執行看下結果

go build -o test.bin
./test.bin test test1 --uid=111 --username=hello
111 hello
./test.bin test test2 --uid=111 --username=hello
111 hello

就是再加了一層命令

命令列的使用比較簡單。基本也沒有需要注意的。
如果需要了解更詳細的使用,看下文件
https://github.com/urfave/