GO Cobra Termui庫開發(fā)終端命令行小工具輕松上手
Golang實現(xiàn)命令行小工具
"看到有人用Rust寫終端天氣查詢小工具,一時興起,用Golang也做了個命令行小工具,效果如下:"
其實用golang 來寫終端小工具,還是很方便的,有許多可用的庫比如這里用到的 Cobra,Termui庫.
Cobra 庫
cobra是一個命令行程序庫,可以用來編寫命令行程序。同時,它也提供了一個腳手架, 用于生成基于 cobra 的應(yīng)用程序框架。非常多知名的開源項目使用了 cobra 庫構(gòu)建命令行,如Kubernetes、Hugo、etcd等等等等。
安裝
go get github.com/spf13/cobra/cobra
注意: 安裝完成以后,先去 go/bin/ 下找找 看是否有這個命令
使用
新建一個項目文件夾 pf_tools 然后進(jìn)入項目中 執(zhí)行:
cobra-cli init
就會初始化一個命令項目,結(jié)構(gòu)如下:
├── LICENSE ├── README.md ├── cmd │ ├── pfM.go │ ├── pfWt.go │ └── root.go ├── go.mod ├── go.sum ├── main.go └── pak ├── mobile.go └── weather.go
其中, cmd 目錄中默認(rèn)生成 root.go 文件,代碼如下:
package cmd import ( "os" "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{ Use: "pf_tools", Short: "pft", Long: `基于go開發(fā)的 小工具集合 - pft pf_wt 查詢天氣 - pft pf_m 手機歸屬地查詢 `, Run: func(cmd *cobra.Command, args []string) { if len(args) == 0 { err := cmd.Help() if err != nil { return } return } }, } func Execute() { err := rootCmd.Execute() if err != nil { os.Exit(1) } } func init() { rootCmd.Flags().BoolP("version", "v", false, "") }
cobra.Command 代表一個命令,其各個屬性含義如下:
- Use 是命令的名稱。
- Short 代表當(dāng)前命令的簡短描述。
- Long 表示當(dāng)前命令的完整描述。
- Run 屬性是一個函數(shù),當(dāng)執(zhí)行命令時會調(diào)用此函數(shù)。
rootCmd.Execute() 是命令的執(zhí)行入口,其內(nèi)部會解析 os.Args[1:] 參數(shù)列表(默認(rèn)情況下是這樣,也可以通過 Command.SetArgs 方法設(shè)置參數(shù)),然后遍歷命令樹,為命令找到合適的匹配項和對應(yīng)的標(biāo)志。
添加子命令
因為小工具不止一個功能,所以需要添加子命令,如:
cobra-cli add pf_m
代碼和 root.go 中的代碼相似,也是那幾步,
package cmd import ( "github.com/pfinal/pf_tools/pak" "github.com/spf13/cobra" ) // pfMCmd represents the pfM command var pfMCmd = &cobra.Command{ Use: "pf_m", Short: "pfm", Long: `查詢對應(yīng)手機的歸屬地`, Run: func(cmd *cobra.Command, args []string) { if len(args) == 0 { _ = cmd.Help() return } if pak.CheckMobile(args[0]) == false { _ = cmd.Help() return } m := pak.Mobile{} m.GetInfo(args[0]) }, } func init() { rootCmd.AddCommand(pfMCmd) }
沒啥特殊的, 就是添加一個命令, 然后初始化一下,然后實現(xiàn)功能.
Termui 庫
為了能夠在終端顯示的好看, 就使用了 termui 的庫, termui是構(gòu)建在termbox-go之上的一個跨平臺的完全可自定義的終端dashboard 以及widget 庫
安裝
因為使用了 go mod 來管理,所以這里就不用 go get 了,直接使用 go mod 即可.
代碼中導(dǎo)入:
ui "github.com/gizak/termui/v3" "github.com/gizak/termui/v3/widgets"
然后 go mod tidy 然后mod 自己下載去吧
布局
前面天氣查詢的 使用了 Table 小組件, 代碼如下:
defer ui.Close() table := widgets.NewTable() table.Title = res.City + "天氣" table.BorderStyle = ui.NewStyle(ui.ColorRed) table.Rows = [][]string{ []string{"日期", "天氣", "風(fēng)向", "體感溫度"}, } for _, v := range res.Weather { table.Rows = append(table.Rows, []string{v.Date, v.Weather, v.Wind, v.Temp}) } table.TextStyle = ui.NewStyle(ui.ColorGreen) table.TitleStyle = ui.NewStyle(ui.ColorGreen) table.SetRect(0, 0, 60, 10) ui.Render(table) uiEvents := ui.PollEvents() for { e := <-uiEvents switch e.ID { case "q", "<C-c>": return case "c": } }
手機查詢的使用了 List 小組件,代碼如下:
defer ui.Close() l := widgets.NewList() l.Title = "號碼詳細(xì)信息" l.Rows = []string{ "[0] 查詢的號碼:" + pr.PhoneNum, "[1] 號碼運營商:" + pr.CardType, "[2] 號碼所在省份:" + pr.Province, "[3] 號碼所在城市:" + pr.City, "[4] 所在城市郵編:" + pr.ZipCode, "[5] 所在地區(qū)編碼:" + pr.AreaZone, } l.TextStyle = ui.NewStyle(ui.ColorGreen) l.TitleStyle = ui.NewStyle(ui.ColorGreen) l.WrapText = false l.SetRect(0, 0, 40, 8) ui.Render(l) previousKey := "" uiEvents := ui.PollEvents()
結(jié)構(gòu)沒有大的變化, Termui 官方的 github 倉庫中有例子, 但是 官方的例子中,有些 屬性沒有使用, 比如 table.Title, l.TitleStyle 這種,需要自己嘗試去寫
代碼地址
https://github.com/GoFinalPack/pf_tools
最后愉快的玩耍吧
以上就是GO語言開發(fā)終端命令行小工具輕松上手的詳細(xì)內(nèi)容,更多關(guān)于GO開發(fā)終端命令行小工具的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解
結(jié)構(gòu)體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構(gòu)體和方法,以及“繼承”的實現(xiàn)方法2021-09-09Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例
cap 是一個常用的內(nèi)建函數(shù),它用于獲取某些數(shù)據(jù)結(jié)構(gòu)的容量,本文主要介紹了Go語言內(nèi)建函數(shù)cap的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-08-08