目录
编译成windows文件
SET CGO_ENABLED=1
SET GOARCH=
SET GOOS=windows
go build
编译成Linux文件
SET CGO_ENABLED=0
SET GOARCH=amd64
SET GOOS=linux
go build
静态资源文件打包
上述打包只能打包go语言文件,如果项目中使用了静态资源或配置文件不会被进行打包,运行打包后的文件会报错
解决方法:利用go-bindata将配置文件打包进二进制go文件
首先安装go-bindata
go get -u github.com/jteeuwen/go-bindata/... # golang
go-bindata #执行此命令验证安装成功与否
#如果命令执行失败,则
echo $GOPATH/bin #查看gopath/bin目录是否有go-bindata可执行文件
cp $GOPATH/bin/go-bindata /bin
go-bindata 将静态文件打包成 go 文件
go-bindata -o=bindata/bindata.go -pkg=bindata conf/... crts/...
-o=bindata/bindata.go : 打包生成的 bindata.go 文件, 放到 bindata/ 目录下
-pkg=bindata : 打包生成的 bindata.go 文件, 包名设置为 bindata
conf/… crts/… : 需要打包的文件夹下的所有文件
查看命令参数
go-bindata --help
go程序中获取go-bindata打包的静态资源
方式1:go程序中直接读取 go-bindata打包的静态文件内容(无法实时修改)
func main() {
// 获取所有资源路径和文件名称
assets := bindata.AssetNames()
for _, asset := range assets {
//获取配置文件内容,bytes中就是配置文件内容的字节数组
bytes, err := bindata.Asset(asset)
fmt.Println(bytes, err)
}
}
方式2:将配置文件解压到与静态资源路径相同的文件夹中,再通过go程序读取配置文件获取(可实时修改)
func main() {
// 释放资源文件
releaseResources()
// 加载配置文件(此处省略)
config.LoadConfiguration()
......
}
/**
* @ Time: 2020/12/28 13:49
* @ Author: qyz
* @ Description: 释放bindata打包的静态资源
* @ Param:
* :
* @ return:
* :
**/
func releaseResources() {
// 要bindata打包前的静态文件路径
confPath := "./conf"
crtsPath := "./crts/mqtt"
// 递归创建文件夹
err := os.MkdirAll(confPath, os.ModePerm)
if err != nil {
log.Fatal("os.MkdirAll 创建静态资源文件出错:", err)
}
err = os.MkdirAll(crtsPath, os.ModePerm)
if err != nil {
log.Fatal("os.MkdirAll 创建静态资源文件出错:", err)
}
// 获取所有资源路径和文件名称
filePaths := bindata.AssetNames()
for _, filePath := range filePaths {
isExist := IsFileOrDirectoryExist(filePath)
if !isExist {
// 如果不存在
// 获取配置文件内容,bytes中就是配置文件内容的字节数组
contentBytes, err := bindata.Asset(filePath)
if err != nil {
log.Fatal("bindata.Asset获取配置失败:", err)
}
writeFile(filePath, contentBytes)
}
}
}
/**
* @ Time: 2020/12/28 10:53
* @ Author: qyz
* @ Description: 将bindata压缩的文件解压到当前目录
* @ Param:
* :
* @ return:
* :
**/
func writeFile(filePath string, contentBytes []byte) {
file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
log.Fatal("os.OpenFile 出错:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
if _, err := writer.Write(contentBytes); err != nil {
log.Fatal("bufio.NewWriter().Write() 出错:", err)
}
if err := writer.Flush(); err != nil {
log.Fatal("bufio.NewWriter().Flush() 出错:", err)
}
}
/**
* @ Time: 2020/12/28 10:46
* @ Author: qyz
* @ Description: 判断文件或文件夹是否存在
* @ Param:
* :
* @ return:
* :
**/
func IsFileOrDirectoryExist(filePath string) bool {
_, err := os.Stat(filePath)
return err == nil || os.IsExist(err)
}
想要学习更多Go语言语法和Go语言在工作中的常用知识点可以参考我的笔记源码 https://github.com/qiuyunzhao/go_basis