1. 程式人生 > >Golang中基礎的命令列模組urfave/cli

Golang中基礎的命令列模組urfave/cli

前言

相信只要部署過線上服務,都知道啟動引數一定是必不可少的,當你在不同的網路、硬體、軟體環境下去啟動一個服務的時候,總會有一些啟動引數是不確定的,這時候就需要通過命令列模組去解析這些引數,urfave/cli是Golang中一個簡單實用的命令列工具。

安裝

通過 go get github.com/urfave/cli 命令即可完成安裝。

正文

使用了urfave/cli之後,你的程式就會變成一個命令列程式,以下就是通過urfave/cli建立的一個最簡單的命令列程式,它設定了一些基礎的資訊,這個程式的最終只是簡單的列印了Test資訊。

package main

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

func main() {
	//例項化一個命令列程式
	oApp := cli.NewApp()
	//程式名稱
	oApp.Name = "GoTool"
	//程式的用途描述
	oApp.Usage = "To save the world"
	//程式的版本號
	oApp.Version = "1.0.0"
	//該程式執行的程式碼
	oApp.Action = func(c *cli.Context) error {
		fmt.Println("Test")
		return nil
	}
	//啟動
	if err := oApp.Run(os.Args); err != nil {
		log.Fatal(err)
	}
	/*
	result:
	[
[email protected]
cli]# go run main.go help NAME: GoTool - To save the world USAGE: main [global options] command [command options] [arguments...] VERSION: 1.0.0 COMMANDS: help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --help, -h show help --version, -v print the version [
[email protected]
cli]# go run main.go Test */ }

我們看到執行 go run main.go help 之後會輸出一些幫助資訊,說明你的程式已經成功成為一個命令列程式,接著使用命令 go run main.go 執行這個程式,結果是列印了Test資訊,所以這個程式實際執行的函式由oApp.Action來控制,你後面的程式碼應該都在這個函式的內部去實現。

接下來我們設定一些常見的啟動引數,非常的簡單,程式碼如下

package main

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

func main() {
	//例項化一個命令列程式
	oApp := cli.NewApp()
	//程式名稱
	oApp.Name = "GoTool"
	//程式的用途描述
	oApp.Usage = "To save the world"
	//程式的版本號
	oApp.Version = "1.0.0"

	//預置變數
	var host string
	var debug bool

	//設定啟動引數
	oApp.Flags = []cli.Flag{
		//引數型別string,int,bool
		cli.StringFlag{
			Name:        "host",         //引數名字
			Value:       "127.0.0.1",      //引數預設值
			Usage:       "Server Address", //引數功能描述
			Destination: &host,            //接收值的變數
		},
		cli.IntFlag{
			Name:        "port,p",
			Value:       8888,
			Usage:       "Server port",
		},
		cli.BoolFlag{
			Name:        "debug",
			Usage:       "debug mode",
			Destination: &debug,
		},
	}

	//該程式執行的程式碼
	oApp.Action = func(c *cli.Context) error {
		fmt.Printf("host=%v \n",host)
		fmt.Printf("host=%v \n",c.Int("port")) //不使用變數接收,直接解析
		fmt.Printf("host=%v \n",debug)
		/*
		result:
		[
[email protected]
cli]# go run main.go --port 7777 host=127.0.0.1 host=7777 host=false [[email protected] cli]# go run main.go help NAME: GoTool - To save the world USAGE: main [global options] command [command options] [arguments...] VERSION: 1.0.0 COMMANDS: help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --host value Server Address (default: "127.0.0.1") --port value, -p value Server port (default: 8888) --debug debug mode --help, -h show help --version, -v print the version */ return nil } //啟動 if err := oApp.Run(os.Args); err != nil { log.Fatal(err) } }

執行 go run main.go --port 7777 之後,可以看到輸出了設定的7777埠而非預設的8888埠,而伺服器地址(host)和除錯模式(debug)都輸出了預設的數值。

如果第三方人員第一次使用你的程式也可以通過help命令看到可以設定的引數都有哪些,非常的人性化。

當然,urfave/cli還允許我們設定多個命令,不同的命令執行不同的操作,具體如下

package main

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

func main() {
	//例項化一個命令列程式
	oApp := cli.NewApp()
	//程式名稱
	oApp.Name = "GoTool"
	//程式的用途描述
	oApp.Usage = "To save the world"
	//程式的版本號
	oApp.Version = "1.0.0"

	//設定多個命令處理函式
	oApp.Commands = []cli.Command{
		{
			//命令全稱
			Name:"lang",
			//命令簡寫
			Aliases:[]string{"l"},
			//命令詳細描述
			Usage:"Setting language",
			//命令處理函式
			Action: func(c *cli.Context) {
				// 通過c.Args().First()獲取命令列引數
				fmt.Printf("language=%v  \n",c.Args().First())
			},
		},
		{
			Name:"encode",
			Aliases:[]string{"e"},
			Usage:"Setting encoding",
			Action: func(c *cli.Context) {
				fmt.Printf("encoding=%v \n",c.Args().First())
			},
		},
	}

	//啟動
	if err := oApp.Run(os.Args); err != nil {
		log.Fatal(err)
	}

	/*
	[[email protected] cli]# go run main.go  l english
	language=english  
	
	[[email protected] cli]# go run main.go  e utf8
	encoding=utf8 
	
	[[email protected] cli]# go run main.go  help
	NAME:
	   GoTool - To save the world
	
	USAGE:
	   main [global options] command [command options] [arguments...]
	
	VERSION:
	   1.0.0
	
	COMMANDS:
		 lang, l    Setting language
		 encode, e  Setting encoding
		 help, h    Shows a list of commands or help for one command
	
	GLOBAL OPTIONS:
	   --help, -h     show help
	   --version, -v  print the version
	*/

}

上面程式碼只實現了兩個簡單命令,兩個命令最後的處理函式不同,自然使用不同命令,最後的輸出也不一樣。

完結

最後感謝大家,希望各位同仁多提寶貴意見,謝謝支援。