千家信息网

Golang如何打包配置文件

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍了Golang如何打包配置文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。背景最近在写一个涉及到管理阿里云 ECS
千家信息网最后更新 2025年02月02日Golang如何打包配置文件

这篇文章主要介绍了Golang如何打包配置文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

背景

最近在写一个涉及到管理阿里云 ECS 的 CLI 工具,这里当然就要考虑阿里云资源使用的安全性了,要求阿里云账号的 AccessKeyId 和 AccessKeySecret 不能下发给 CLI 工具的使用者。

所以这里选择将一份包含 AccessKeyId 和 AccessKeySecret 的配置文件打包进了 CLI 工具中,CLI 工具的使用者默认将使用已经打包了的配置文件,当然也可以通过指定配置文件或传递参数的方式使用新的配置信息。

实现

工具

这里将介绍 Golang 的一个可以把任意文件转换成 Go 代码的库 go-bindata,可以用于嵌入二进制文件到 Go 程序中。同时,也支持在转换成原始的字节切片前使用 gzip 进行压缩文件数据。
关于该工具的具体介绍请跳转至 https://github.com/go-bindata/go-bindata

打包

使用 go-bindata 工具将包含敏感信息的配置文件转换成 Go 的源代码,下面是项目 Makefile 的部分内容,工具名称就叫 mycli 吧。

NAME = mycliCONFIG = configs/config.yaml.PHONY: buildbuild:    cp $(CONFIG) config.yaml    mkdir -p cmd/mycli/asset    go-bindata -pkg asset -o cmd/mycli/asset/asset.go \        scripts/... \        config.yaml        CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/linux/mycli cmd/mycli/*.go    CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bin/darwin/mycli cmd/mycli/*.go        chmod +x ./bin/linux/mycli ./bin/darwin/mycli    rm -f config.yaml mycli    ln -s bin/linux/mycli mycli

其中将文件转换成 Go 源代码的部分如下:

go-bindata -pkg asset -o cmd/mycli/asset/asset.go \    scripts/... \    config.yaml

关于 go-bindata 命令行工具的选项说明:

  • -pkg 指定 package 名称,调用的写法将变成 asset.Asset("config.yaml")

  • -o 指定生成的 Go 源代码存放的位置

生成的 asset.go 代码如下:

// Code generated by go-bindata.// sources:// scripts/create.sh// scripts/sub/delete.sh// config.yaml// DO NOT EDIT!package assetfunc bindataRead(data []byte, name string) ([]byte, error) {    ...}type asset struct { bytes []byte info  os.FileInfo}type bindataFileInfo struct { name    string size    int64 mode    os.FileMode modTime time.Time}func (fi bindataFileInfo) Name() string { return fi.name}func (fi bindataFileInfo) Size() int64 { return fi.size}func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode}func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime}func (fi bindataFileInfo) IsDir() bool { return false}func (fi bindataFileInfo) Sys() interface{} { return nil}...

调用

使用 Asset 方法进行加载打包好的配置文件:

const preloadConfigFile = "config.yaml"type Config struct {    ...}func PreloadConfig() (*Config, error) {    b, err := asset.Asset(preloadConfigFile)    if err != nil {        return nil, fmt.Errorf("failed to read config: %v", err)    }    var config *Config    err = yaml.Unmarshal(b, &config)    return config, err}

感谢你能够认真阅读完这篇文章,希望小编分享的"Golang如何打包配置文件"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0