服務計算學習之路-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工具sys
和text
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
這樣在你的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傳送門。