目次
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