1. 程式人生 > >服務計算學習之路-Go版本agenda開發專案

服務計算學習之路-Go版本agenda開發專案

Go版本agenda開發專案

文章目錄

專案簡介

agenda專案是一個CLI程式。實現了使用者的註冊與登入,可以對會議進行建立並進行管理操作,使用者可以檢視自己參與的會議,並且可以檢視log檔案來瀏覽使用者的操作。該程式簡化了會議管理,使小型團體的會議管理更加方便,高效。

開發環境

  • CentOS7
  • go 1.9.4 linux/amd64

安裝使用

獲取agenda專案,並安裝

go get github.com/cyulei/agenda 
go install github.com/cyulei/agenda

安裝可能會出現cannot find package "golang.org/x/...",這時候需要安裝相應的Go工具,見博主部落格中安裝Go工具部分。agenda專案的命令以及引數詳情見github中的README。

專案實現

cobra包

cobra既是一個用來建立強大的現代CLI命令列的golang庫,也是一個生成程式應用和命令列檔案的程式。因為本次專案是一個命令列程式,所以涉及到讀寫引數問題,之前是使用pflag來實現引數的讀入。但是cobra的使用可以快速生成命令列檔案程式,構建一個命令列程式的框架。

安裝cobra

首先安裝cobra需要依賴的Go工具systext

go get -d github.com/golang/sys  //下載
cp $GOPATH/src/github.com/golang/sys $GOPATH/src/golang.org/x/ -rf   //複製移動
go install golang.org/x/sys   //安裝工具包

go get -d github.com/golang/text  //下載
cp $GOPATH/src/github.com/golang/text $GOPATH/src/golang.org/x/ -rf   //複製移動
go install golang.org/x/text   //安裝工具包

然後安裝cobra

go get -v github.com/spf13/cobra/cobra
使用cobra

安裝完成後,在專案目錄中,如在你的git賬號下建立了testcobra,則在$GOPATH\src\github.com\yourgitcount\testcobra下使用下列命令。初始化cobra並且建立命令register

cobra init
cobra add register

testcobra
tupian
這樣在你的agenda目錄下面就出現了一些檔案,然後在register中的init()新增,新增引數標記,使用方式和pflag包中一樣:

egisterCmd.Flags().StringP("user", "u", "Anonymous", "Help message for username")

然後在Run匿名回撥函式中新增:

username, _ := cmd.Flags().GetString("user")
fmt.Println("register called by " + username)

測試命令:

$ go run main.go register --user=TestUser
register called by TestUser

之後的其他命令實現方式一樣,只是在各自的init()中建立不同的引數,在Run匿名回撥函式中進行邏輯的處理。

json檔案存取

json實現檔案的存取,因為在go語言中json是內建的,可以通過import ("encoding/json")匯入。使用json.Unmarshal()json.Marshal()方法對傳入的資料結構進行解碼和編碼。通過ioutil.ReadFile()將json資料從檔案中讀入,使用ioutil.WriteFile()將json格式的資料寫入檔案中。具體使用資訊見官方文件
例如:

func GetMeetings() []entity.Meeting {
	filePath := "datarw/Meetings.json"
	var Meetings []entity.Meeting
	if existFile(filePath) {
		//讀json檔案
		josnStr, err := ioutil.ReadFile(filePath)
		checkError(err)
		//檢查是否是空檔案
		str := strings.Replace(string(josnStr), "\n", "", 1)
		if str == "" {
			return Meetings
		}
		//解碼json檔案,將內容解碼到Meetings中
		err = json.Unmarshal(josnStr, &Meetings)
		checkError(err)
	}
	return Meetings
}

log的輸出

Golang提供了原生日誌庫“log”,所以使用也很簡單。可以通過import ("log")匯入。具體使用資訊見:官方文件
例如:

//開啟日誌檔案,第二個引數為開啟檔案的模式,第三個引數為檔案許可權,參考linux檔案許可權
fileName := "datarw/Agenda.log"
logFile, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)

//第一個引數為輸出io,此處為日誌檔案,第二個引數為自定義字首,第三個引數為輸出日誌的格式選項,這裡輸出了日期+時間+檔案及行號
infoLog := log.New(logFile, "[Info]", log.Ldate|log.Ltime|log.Lshortfile)

//可以在中途設定log的自定義字首
infoLog.SetPrefix("[Error]")
//輸出log
infoLog.Println("Not log in yet")

//Fatal實現了日誌輸出且直接終止程式
infoLog.Fatal("Open file error")

Travis CI

Travis CI 是目前新興的開源持續整合構建專案,寫好測試用例之後,每次push到github都會自動測試,提高軟體開發的效率。因為我的agenda專案是公開的,測試的時候也不需要涉及到隱私資訊,所以不用進行加密。

Travis CI的使用

首先先建立Travis CI賬號,一般使用github賬號來登入。然後點選頭像中的Settings,Travis 會列出 Github 上面你的所有倉庫。開啟倉庫旁邊的開關,Travis就會會監聽這個倉庫的所有變化,並且自動測試。
圖片

.travis.yml檔案是配置檔案,該檔案必須儲存在 Github 倉庫裡面,一旦程式碼倉庫有新的 Commit,Travis CI 就會去找這個檔案並且執行裡面的命令。這次專案中我的.travis.yml是:

language: go
sudo: false
go:
  - 1.8.x
  - 1.9.x
  - 1.10.x
  - master

script:
- go test ./entity

其中,language欄位指定了預設執行環境,這裡設定使用 go 環境,不需要sudo許可權,script欄位指定要執行的指令碼,這裡我是使用Go語言中自帶的go test命令來實現單元測試和效能測試,go欄位指定了測試的語言版本號。go語言的.travis.yml中更多欄位編寫可以見:官方文件

gotests外掛

因為專案中的.travis.yml檔案需要執行go test命令,所以需要編寫test檔案,不過gotests外掛可以為我們自動生成需要的test檔案並搭好框架。

使用go get 去安裝和更新gotests

go get -u github.com/cweill/gotests

通過下面的命令可以實現輸出一個指定檔案中的所有函式的Test函式,並且輸出一個xxx_test檔案。在檔案中的TODO那裡可以新增自己想要測試的樣例引數。

gotests -w -all ./entity/EntityFunc.go

圖片

更多關於gotests的使用可以見gotests的github地址

總結

這次專案是多人合作完成的,最後完成了基本的CLI 命令列實用程式開發實戰 - Agenda專案的開發。
專案的原始碼以及使用和測試見:github傳送門