本文介紹用于構(gòu)建命令行程序的開源工具 mkideal/cli 。golang標準庫 flag 是官方自帶的用于命令行參數(shù)解析的實用庫,而本文介紹的 cli 的主要功能基本與 flag 庫相同,但是提供相對簡潔友好的用法以及更多實用工具。 cli 的主要特性包括:
cli 開源在github上 https://github.com/mkideal/cli
命令行程序雖然沒有華麗的界面,但是在服務器端,命令行程序是不可或缺的,而且在很多時候比圖形界面更加好用。在unix/linux操作系統(tǒng)上命令行程序極其常見,系統(tǒng)上預裝大量程序。 cli 這個工具正是用來便捷構(gòu)建這種命令行程序的go語言庫。 先看一個簡單的示例:
package mainimport ( "github.com/mkideal/cli")type argT struct { cli.Helper}func main() { cli.Run(&argT{}, func(ctx *cli.Context) error { argv := ctx.Argv().(*argT) if argv.Help { ctx.WriteUsage() } else { ctx.String("hello\n") } return nil })}
編譯運行這段代碼
$ go build -o app$ ./apphello$ ./app -hOptions: -h, --help display help
當然這段代碼沒有任何實質(zhì)功能。代碼第12行調(diào)用 cli 的 Run 函數(shù),函數(shù)原型如下:
func Run(argv interface{}, fn func(*Context) error, descs ...string)
參數(shù) argv 在執(zhí)行時會通過解析命令行參數(shù)來賦值,然后塞進 Context 對象,最終傳遞給回調(diào)函數(shù) fn 。在回調(diào)函數(shù)中通過 ctx.Argv() 獲得 argv 。
本示例代碼的 argT 繼承于 cli.Helper ,它的定義如下:
type Helper struct { Help bool `cli:"!h,help" usage:"display help"`}
好了,下面創(chuàng)建一個實用一點的程序來做更詳細的講解。
package mainimport ( "fmt" "net/http" "github.com/mkideal/cli")type argT struct { cli.Helper Host string `cli:"H,host" usage:"specify host" dft:"0.0.0.0"` Port uint16 `cli:"p,port" usage:"specify port" dft:"8080"` Dir string `cli:"d,dir" usage:"static files directory" dft:"./"`}func main() { cli.SetUsageStyle(cli.ManualStyle) cli.Run(new(argT), func(ctx *cli.Context) error { argv := ctx.Argv().(*argT) if argv.Help { ctx.WriteUsage() return nil } http.Handle("/", http.FileServer(http.Dir(argv.Dir))) addr := fmt.Sprintf("%s:%d", argv.Host, argv.Port) ctx.String("listening on %s\n", addr) http.ListenAndServe(addr, nil) return nil })}
在這個例子里,參數(shù)對象 argT 多了幾個有用的字段: Host Port Dir
還是先編譯運行一下
$ go build -o httpd$ ./httpd -h
好了,現(xiàn)在創(chuàng)建一個 html 目錄,然后新建一個文件 index.html ,內(nèi)容為
Hello, this is my http server!
然后啟動 http server
$ mkdir html$ echo "Hello, this is my http server!
" > html/index.html$ ./httpd -d htmllistening on 0.0.0.0:8080
現(xiàn)在通過瀏覽器訪問 127.0.0.1:8080 就可以看到
你還可以指定別的端口,而非默認的端口8080,比如指定端口為3000
可以這樣啟動
$ ./httpd -d html --port=3000
或者
$ ./httpd -d html --port 3000
或者
$ ./httpd -d html -p=3000
或者
$ ./httpd -d html -p 3000
接下來講述一下出現(xiàn)在參數(shù)定義中的標簽,它們是解析參數(shù)以及顯示幫助時器關(guān)鍵作用的因素。
cli 支持4個標簽
clier 是 mkideal/cli 下的一個命令行程序,它也是使用 cli 構(gòu)建的。 clier 用于創(chuàng)建一條命令,比如這樣
$ clier hello$ clier -s "this is hello command's description" hello
goplus 的 new 子命令可以構(gòu)建完整的基于 cli 的命令行程序。使用示例
$ goplus new hello # 最基本的單命令程序$ goplus new -t http httpd # 通過 `-t` 參數(shù)指定程序類型為`http`$ goplus new -t tree demo # 基本的多命令程序
本文只是一個 cli 的簡要介紹。下面幾篇是關(guān)于 cli 的更詳細的介紹
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com