Go 项目编译Linux或Windows可执行文件

编译成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

猜你喜欢

转载自blog.csdn.net/QiuHaoqian/article/details/106780743