Как мы все знаем, Golang подходит для написания инструментов CLI, но вы можете не знать, что Golang также может упаковывать файлы конфигурации.
задний план
Недавно я пишу инструмент CLI, который включает в себя управление Alibaba Cloud ECS.Конечно, здесь необходимо учитывать безопасность ресурсов Alibaba Cloud.Необходимо, чтобы AccessKeyId и AccessKeySecret учетной записи Alibaba Cloud не могли быть распространены среди пользователей инструмент командной строки.
Итак, здесь мы решили упаковать файл конфигурации, содержащий AccessKeyId и AccessKeySecret, в инструмент CLI. Пользователи инструмента CLI будут использовать упакованный файл конфигурации по умолчанию. Конечно, они также могут использовать новый файл конфигурации, указав файл конфигурации или передача параметров информация о конфигурации.
выполнить
инструмент
Вот библиотека для Golang, которая может конвертировать произвольные файлы в код Go.go-bindata
, который можно использовать для встраивания двоичных файлов в программы Go. В то же время gzip также поддерживается для сжатия файловых данных перед преобразованием в необработанные фрагменты байтов.
Подробное знакомство с этим инструментом см.GitHub.com/go-pennhe/…
Бэйл
использовать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
Укажите имя пакета, и вызов будет записан как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.
Оригинальная ссылка:Доступно на 8scat.com/posts/build…