首页后端开发其他后端知识Golang打包配置文件是怎么实现的,具体方法是什么?

Golang打包配置文件是怎么实现的,具体方法是什么?

时间2024-03-26 19:24:03发布访客分类其他后端知识浏览1322
导读:这篇文章主要给大家介绍“Golang打包配置文件是怎么实现的,具体方法是什么?”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“Golang打包配置文件是怎么实现的,具体方法...
这篇文章主要给大家介绍“Golang打包配置文件是怎么实现的,具体方法是什么?”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“Golang打包配置文件是怎么实现的,具体方法是什么?”文章能对大家有所帮助。

 

众所周知,Golang 适合写 CLI 工具,但你可能还不知道 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 = mycli
CONFIG = configs/config.yaml

.PHONY: build

build:
    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 asset

func 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
}
    

总结

使用 go-bindata 将文件转换成 Go 的源代码,然后编译成二进制文件,最终只需要将二进制文件交给使用者,通过这种方式可以减少工具的使用者对一些敏感信息的直接接触,保障资源的安全性。
其实,真正要做到对资源访问的完全把控,可以将 CLI 工具再次进行封装成 Jenkins job 类似的可视化操作界面,既方便使用者使用,又可以限制使用者对工具的使用范围,包括传递给 CLI 工具的参数。



关于“Golang打包配置文件是怎么实现的,具体方法是什么?”的内容就介绍到这,感谢各位的阅读,相信大家对Golang打包配置文件是怎么实现的,具体方法是什么?已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Golang打包配置文件是怎么实现的,具体方法是什么?
本文地址: https://pptw.com/jishu/653707.html
jQuery中Mobile窗体长内容显示问题如何优化 php中fopen()函数用来做什么?怎样使用?

游客 回复需填写必要信息