经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Golang打包配置文件的实现示例
来源:jb51  时间:2021/12/8 8:38:20  对本文有异议

众所周知,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 吧。

  1. NAME = mycli
  2. CONFIG = configs/config.yaml
  3.  
  4. .PHONY: build
  5.  
  6. build:
  7. cp $(CONFIG) config.yaml
  8. mkdir -p cmd/mycli/asset
  9. go-bindata -pkg asset -o cmd/mycli/asset/asset.go scripts/... config.yaml
  10. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/linux/mycli cmd/mycli/*.go
  11. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o bin/darwin/mycli cmd/mycli/*.go
  12. chmod +x ./bin/linux/mycli ./bin/darwin/mycli
  13. rm -f config.yaml mycli
  14. ln -s bin/linux/mycli mycli

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

  1. 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 代码如下:

  1. // Code generated by go-bindata.
  2. // sources:
  3. // scripts/create.sh
  4. // scripts/sub/delete.sh
  5. // config.yaml
  6. // DO NOT EDIT!
  7.  
  8. package asset
  9.  
  10. func bindataRead(data []byte, name string) ([]byte, error) {
  11. ...
  12. }
  13.  
  14. type asset struct {
  15. bytes []byte
  16. info os.FileInfo
  17. }
  18.  
  19. type bindataFileInfo struct {
  20. name string
  21. size int64
  22. mode os.FileMode
  23. modTime time.Time
  24. }
  25.  
  26. func (fi bindataFileInfo) Name() string {
  27. return fi.name
  28. }
  29. func (fi bindataFileInfo) Size() int64 {
  30. return fi.size
  31. }
  32. func (fi bindataFileInfo) Mode() os.FileMode {
  33. return fi.mode
  34. }
  35. func (fi bindataFileInfo) ModTime() time.Time {
  36. return fi.modTime
  37. }
  38. func (fi bindataFileInfo) IsDir() bool {
  39. return false
  40. }
  41. func (fi bindataFileInfo) Sys() interface{} {
  42. return nil
  43. }
  44.  
  45. ...

调用

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

  1. const preloadConfigFile = "config.yaml"
  2.  
  3. type Config struct {
  4. ...
  5. }
  6.  
  7. func PreloadConfig() (*Config, error) {
  8. b, err := asset.Asset(preloadConfigFile)
  9. if err != nil {
  10. return nil, fmt.Errorf("failed to read config: %v", err)
  11. }
  12. var config *Config
  13. err = yaml.Unmarshal(b, &config)
  14. return config, err
  15. }

总结

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

到此这篇关于Golang打包配置文件的实现示例的文章就介绍到这了,更多相关Golang打包配置文件内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号