agenda项目是一个CLI程序。实现了用户的注册与登录,可以对会议进行创建并进行管理操作,用户可以查看自己参与的会议,并且可以查看log文件来浏览用户的操作。该程序简化了会议管理,使小型团体的会议管理更加方便,高效。
获取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既是一个用来创建强大的现代CLI命令行的golang库,也是一个生成程序应用和命令行文件的程序。因为本次项目是一个命令行程序,所以涉及到读写参数问题,之前是使用pflag来实现参数的读入。但是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
安装完成后,在项目目录中,如在你的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实现文件的存取,因为在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
}
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 是目前新兴的开源持续集成构建项目,写好测试用例之后,每次push到github都会自动测试,提高软件开发的效率。因为我的agenda项目是公开的,测试的时候也不需要涉及到隐私信息,所以不用进行加密。
首先先创建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中更多字段编写可以见:官方文档
因为项目中的.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传送门。