プロジェクトに移動して、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