go如何編寫命令行(cli)程序


創建一個命令行程序

問題

如何使用golang創建可以在命令行當中傳遞參數的程序?go如何帶參數執行程序?
比如我們期望使用hello -version來查看hello程序的版本號碼。或者輸入hello language chinese 來切換hello程序的語言版本。

解決

在網絡上大家可以經常搜索到的解決方案是使用go標准庫當中的os.Args或者flag方法獲取命令行參數再執行程序。可以很容易google和baidu的這里就不重復說明了。
這里介紹一個開源的cli庫的解決方案。

urfave/cli

該cli庫集成了很多創建cli程序的工具和方法,官方github庫文檔功能案例介紹比較全面很容易學習使用。

截止到2018年2月19日,該開源庫有875次commit,33次releases,7462個star。經過長期迭代和社區驗證功能比較完整,程序穩定性也相對會可靠很多。

實現查看版本和切換語言的程序功能

注:本案例代碼只是簡單的打印出language而已。

package main import ( "os" "github.com/urfave/cli" "fmt" ) func main() { //實例化cli app := cli.NewApp() //Name可以設定應用的名字 app.Name = "hello" // Version可以設定應用的版本號 app.Version = "1.0.0" // Commands用於創建命令 app.Commands = []cli.Command{ { // 命令的名字 Name: "language", // 命令的縮寫,就是不輸入language只輸入lang也可以調用命令 Aliases: []string{"lang"}, // 命令的用法注釋,這里會在輸入 程序名 -help的時候顯示命令的使用方法 Usage: "change language", // 命令的處理函數 Action: func(c *cli.Context) error { language := c.Args().First() if language == "chinese"{ fmt.Println("Language is 中文") }else { fmt.Println("Language is English") } return nil }, }, } // 接受os.Args啟動程序 app.Run(os.Args) } 

效果

liuMacBook-Pro:gowork liuyunpeng$ go run hello.go -help NAME: hello - A new cli application USAGE: hello [global options] command [command options] [arguments...] VERSION: 1.0.0 COMMANDS: language, lang change language help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --help, -h show help --version, -v print the version liuMacBook-Pro:gowork liuyunpeng$ go run hello.go -version hello version 1.0.0 liuMacBook-Pro:gowork liuyunpeng$ go run hello.go lang chinese Language is 中文 liuMacBook-Pro:gowork liuyunpeng$ go run hello.go lang french Language is English liuyMacBook-Pro:gowork liuyunpeng$ go run hello.go lang english Language is English 

更多的使用方法可以登錄urfave/cli查看。

擴展

1.命令行的形式

值得大家注意的是,-flag 前面帶減號(實際上應該是破折號為了方便就縮減成減號了)這種帶標志方式的使用方法和 command 方法是兩個概念。個人理解是前者代表參數的傳遞比如給 -name=ppmoon 就是給name變量傳遞ppmoon參數。后者是執行一段命令,比如 hello add 1 1 返回結果就是2,就是通過hello程序執行了一個1+1的運算,參數通過空格的方式依次傳遞到程序當中了。從使用體驗和角度來說個人認為並沒有什么大的區別,因為本質上來說cli程序只是沒有圖形化的UI界面,我們只是在命令提示符當中操作程序罷了,不管你使用什么樣子的方式傳遞都只是形式上的變化。

2.關於go標准庫當中的flag包以及os.Args方法

flag是官方提供的一個不錯的cli程序擴展包,里面也包含了很多常用的方法。不管是flag還是urfave/cli都需要依賴OS包當中的os.Args方法來獲取命令行參數,這一點是值得注意的便於理解cli程序的原理。

3.設置環境變量在任意文件夾使用cli程序

在Mac Windows Linux我們都會使用到命令行程序,如果想在全局任何一個文件夾下面都使用命令行程序,我們只需要將cli程序的可執行程序文件所在的文件夾路徑添加到環境變量里就可以直接使用程序的名字全局調用cli程序了。具體網絡上可以搜索到諸多教程這里就不贅述了。

 


作者:ppmoon
鏈接:https://www.jianshu.com/p/790dc1171bbf
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM