golang的命令行程式開發

来源:https://www.cnblogs.com/smartrui/archive/2020/04/28/12791323.html
-Advertisement-
Play Games

今天需要用Golang寫一個簡單的命令行小工具,雖然標準庫的flag包也能實現,但是實現起來有些麻煩,而且對多級子命令更不支持,於是在網上找了這幾個spf13、cobra和urfave/cli等,我反正不需要太複雜的,對比了下感覺cli這個庫看上去要相對簡單一些,於是就用這個庫開發了。 git庫地址 ...


今天需要用Golang寫一個簡單的命令行小工具,雖然標準庫的flag包也能實現,但是實現起來有些麻煩,而且對多級子命令更不支持,於是在網上找了這幾個spf13、cobra和urfave/cli等,我反正不需要太複雜的,對比了下感覺cli這個庫看上去要相對簡單一些,於是就用這個庫開發了。

git庫地址:urfave/cli

它有v1和v2版本,我用的是v2,文檔地址是

urfave/cli v2 doc

直接安裝

go get  github.com/urfave/cli/v2

代碼實例

package main

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

func main() {

	app := &cli.App{
		Name:"ZC-Web-Deploy",
		Usage:"項目打包平臺",
		Description:"項目打包平臺,將打好的包上傳至存儲中心上面,運維人員作發佈",
		Commands: []*cli.Command{
			{
				Name:    "project",
				Aliases: []string{"p"},
				Usage:   "deploy project",
				Subcommands:[]*cli.Command{
					{
						Name:    "init",
						Aliases: []string{"i"},
						Usage:   "init the project",
						Action:  func(c *cli.Context) error {
							project.InitProject()
							return nil
						},
					},
					{
						Name:    "build",
						Aliases: []string{"b"},
						Usage:   "build the project as tar to ftp",
						Action:  func(c *cli.Context) error {
							var (
								deployProject *common.DeployProject
							)
							deployProject = &common.DeployProject{
								Domain:c.String("domain"),
								Tag:c.String("tag"),
							}
							if deployProject.Domain == "" || deployProject.Tag == "" {
								fmt.Println("構建的項目功能變數名稱或Tag不能為空")
								return nil
							}
							project.Deploy(deployProject)
							return nil
						},
						Flags: []cli.Flag{
							&cli.StringFlag{
								Name:  "domain, d",
								Value: "xxxx",
								Usage: "指定工程的功能變數名稱",
								Required:true,
							},
							&cli.StringFlag{
								Name:  "tag, t",
								Value: "release-tag",
								Usage: "打包項目的git的tag發佈版本號",
								Required:true,
							},
						},
					},
					{
						Name:    "list",
						Aliases: []string{"ls"},
						Usage:   "list the project",
						Action:  func(c *cli.Context) error {
							var (
								projectList []string
								p string
							)
							projectList = project.ListProject()
							if len(projectList) > 0 {
								for _, p = range projectList {
									fmt.Println(p)
								}
							} else {
								fmt.Println("暫無項目,可以初始化建立project init")
							}
							return nil
						},
					},
				},
				Action:  func(c *cli.Context) error {
					fmt.Println("請指定具體操作: init、ls、build或用 -h 查看命令")
					return nil
				},
			},
		},
	}

	sort.Sort(cli.FlagsByName(app.Flags))
	sort.Sort(cli.CommandsByName(app.Commands))

	err := app.Run(os.Args)
	if err != nil {
		log.Fatal(err)
	}
}






輸入下麵的命令,看到project支持的子命令都看到了

$ go run main.go project -h
NAME:
   ZC-Web-Deploy project - deploy project

USAGE:
   ZC-Web-Deploy project command [command options] [arguments...]

COMMANDS:
   init, i   init the project
   build, b  build the project as tar to ftp
   list, ls  list the project
   help, h   Shows a list of commands or help for one command

OPTIONS:
   --help, -h  show help (default: false)

子命令輸出

$ go run main.go project ls
xxx.com

總體來說,cli的使用還是不難的,填充 cli.App結構體自已需要的欄位就行了,然後在Action執行自已的業務邏輯。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Web前端開發是從網頁製作演變而來的,名稱上有很明顯的時代特征。各種類似桌面軟體的Web應用大量涌現,網站的前端由此發生了翻天覆地的變化。網頁不再只是承載單一的文字和圖片,各種豐富媒體讓網頁的內容更加生動,網頁上軟體化的交互形式為用戶提供了更好的使用體驗,這些都是基於前端技術實現的。 隨著Web前端 ...
  • 前言 由於個人的一些原因最近也參加了幾家公司的面試,發現有很多基礎性的東西掌握程度還是不夠,故此想總結一下最近面試遇到的問題,希望能為在準備面試的的小伙伴盡一些綿薄之力,主要說的是一些我面試當中問到的一些問題,說的不對的地方請小伙伴們即使指正出來,或者有其他的看法也可以一起探討。 一、HTML/CS ...
  • 點擊按鈕實現文件上傳 <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="./jquery.min.js" type="text/ja ...
  • 先說兩句 前面已經講完了 Vuex 下的 、 、 及 這四駕馬車,不知道大家是否已經理解。當然,要想真正熟練掌握的話,還是需要不斷的練習和動手實踐才行。 其實只要把這四駕馬車完全熟練駕馭了,那麼應對一些中小型的項目,基本上就已經沒啥問題了,後面的 Module 這架終極馬車,其實是為了搞定那些稍微大 ...
  • Eureka高可用 1.設置伺服器之間的host,測試環境是在window10上搭建的,所以去修改C:\Windows\System32\drivers\etc文件,如下: 2.創建項目: 3.編輯配置文件: application.yml: #一組服務需要使用相同的服務名稱,才能被識別為一組! a ...
  • 單例模式學習 1 餓漢式單例模式 還沒用就創建了對象,可能會浪費空間 2 懶漢式單例模式 無線程鎖 java package main.java.com.yuehun.singleton; / main.java.com.yuehun.singleton @author yuehun Created ...
  • 一、Spring框架瞭解 Spring框架是一個開源的框架,為JavaEE應用提供多方面的解決方案,用於簡化企業級應用的開發,相當於是一種容器,可以集成其他框架(結構圖如下)。 上圖反映了框架引包的依賴關係(例如:DAO的jar包依賴AOP的jar包,AOP的jar包依賴Core的jar包) 上圖也 ...
  • 線性SVM=線性分類器+最大間隔 間隔的形式化描述 SVM通過最大化`M`來求解參數`W`和`b`的,目標函數如下 拉格朗日乘數法, 軟間隔:加入容錯量 非線性SVM:特征空間。 常用的核函數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...