Golang打包配置文件的实现示例

 更新时间:2021年12月07日 16:22:55   作者:K8sCat  
本文主要介绍了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打包配置文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go操作Kafka和Etcd方法详解

    Go操作Kafka和Etcd方法详解

    这篇文章主要为大家介绍了Go操作Kafka和Etcd方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 一文初探Go语言中的reflect反射包

    一文初探Go语言中的reflect反射包

    这篇文章主要和大家分享一下Go语言中的reflect反射包,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的小伙伴可以参考一下
    2022-12-12
  • 深入解析Go语言中上下文超时与子进程管理

    深入解析Go语言中上下文超时与子进程管理

    这篇文章小编将通过一个实际问题的案例,和大家深入探讨一下Go语言中的上下文超时和子进程管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • GoLand利用plantuml生成UML类图

    GoLand利用plantuml生成UML类图

    本文主要介绍了GoLand利用plantuml生成UML类图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 详解Go中处理时间数据的方法

    详解Go中处理时间数据的方法

    在许多场合,你将不得不编写必须处理时间的代码。在Go中处理时间数据需要你从Go标准库中导入 time 包。这个包有很多方法和类型供你使用,但我选取了最常用的方法和类型,并在这篇文章中进行了描述,感兴趣的可以了解一下
    2023-04-04
  • Golang汇编之控制流深入分析讲解

    Golang汇编之控制流深入分析讲解

    这篇文章主要介绍了Golang汇编之控制流,程序执行的流程主要有顺序、分支和循环几种执行流程,本节主要讨论如何将Go语言的控制流比较直观地转译为汇编程序,或者说如何以汇编思维来编写Go语言代码,感兴趣的同学可以参考下文
    2023-05-05
  • 十个示例带你深入了解Go语言中的接口

    十个示例带你深入了解Go语言中的接口

    这篇文章主要是通过十个简单的示例带大家深入了解一下Go语言中接口的使用,文中的示例代码简洁易懂,具有一定的学习价值,需要的可以了解一下
    2023-02-02
  • golang 用msgpack高效序列化的案例

    golang 用msgpack高效序列化的案例

    msgpack是一个非常受欢迎的Go序列化库,具有很好的跨语言支持,这篇文章主要介绍了golang 用msgpack高效序列化的相关知识,需要的朋友可以参考下
    2023-05-05
  • golang在GRPC中设置client的超时时间

    golang在GRPC中设置client的超时时间

    这篇文章主要介绍了golang在GRPC中设置client的超时时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 使用go来操作redis的方法示例

    使用go来操作redis的方法示例

    今天小编就为大家分享一篇关于使用go来操作redis的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04

最新评论