Файлы конфигурации упаковки Golang, о которых вы не знали | Go Theme Month

Go
Файлы конфигурации упаковки Golang, о которых вы не знали | Go Theme Month

Как мы все знаем, Golang подходит для написания инструментов CLI, но вы можете не знать, что Golang также может упаковывать файлы конфигурации.

задний план

Недавно я пишу инструмент CLI, который включает в себя управление Alibaba Cloud ECS.Конечно, здесь необходимо учитывать безопасность ресурсов Alibaba Cloud.Необходимо, чтобы AccessKeyId и AccessKeySecret учетной записи Alibaba Cloud не могли быть распространены среди пользователей инструмент командной строки.

Alibaba Cload

Итак, здесь мы решили упаковать файл конфигурации, содержащий 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…