服务计算学习之路-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传送门

猜你喜欢

转载自blog.csdn.net/C486C/article/details/83663022