第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

你不知道的 Golang 打包配置文件

標(biāo)簽:
Go

众所周知,Golang 适合写 CLI 工具,但你可能还不知道 Golang 还可以打包配置文件。

背景

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

Alibaba Cload

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

实现

工具

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

关于该工具的具体介绍请跳转至 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 工具的参数。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消