Perfiles de empaquetado de Golang que no conocías | Go Theme Month

Como todos sabemos, Golang es adecuado para escribir herramientas CLI, pero es posible que no sepa que Golang también puede empaquetar archivos de configuración.

antecedentes

Recientemente, estoy escribiendo una herramienta CLI que implica administrar Alibaba Cloud ECS. Por supuesto, la seguridad del uso de recursos de Alibaba Cloud debe tenerse en cuenta aquí. Se requiere que AccessKeyId y AccessKeySecret de la cuenta de Alibaba Cloud no se puedan distribuir a los usuarios de la herramienta CLI.

Alibaba Cload

Por lo tanto, aquí elegimos empaquetar un archivo de configuración que contiene AccessKeyId y AccessKeySecret en la herramienta CLI. De manera predeterminada, los usuarios de la herramienta CLI usarán el archivo de configuración empaquetado. Por supuesto, también pueden usar el nuevo archivo de configuración especificando la configuración archivo o paso de parámetros información de configuración.

lograr

herramienta

Aquí presentaremos una biblioteca Golang que puede convertir archivos arbitrarios en código Go go-bindata, que se puede usar para incrustar archivos binarios en programas Go. Además, gzip es compatible para comprimir datos de archivos antes de convertirlos en segmentos de bytes sin procesar.

Para obtener una introducción específica a la herramienta, vaya a github.com/go-bindata/…

Paquete

Utilice la go-bindataherramienta para convertir el archivo de configuración que contiene información confidencial en el código fuente de Go. Lo siguiente es parte del proyecto Makefile. El nombre de la herramienta se llama 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
复制代码

La parte que convierte el archivo al código fuente de Go es la siguiente:

go-bindata -pkg asset -o cmd/mycli/asset/asset.go \
    scripts/... \
    config.yaml
复制代码

Descripciones de opciones para la herramienta de línea de comandos go-bindata:

  • -pkgEspecifique el nombre del paquete y la llamada se escribirá comoasset.Asset("config.yaml")
  • -oEspecifica la ubicación donde se almacena el código fuente de Go generado

El asset.gocódigo es el siguiente:

// 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
}

...
复制代码

transferir

Utilice el Assetmétodo para cargar el archivo de configuración empaquetado:

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
}
复制代码

Resumir

Use go-bindata para convertir el archivo en el código fuente de Go y luego compílelo en un archivo binario. Al final, solo necesita entregar el archivo binario al usuario. De esta manera, el contacto directo del usuario de la herramienta con se puede reducir parte de la información sensible y se pueden garantizar los recursos.

De hecho, para lograr realmente un control completo sobre el acceso a los recursos, la herramienta CLI se puede volver a empaquetar en una interfaz visual similar a un trabajo de Jenkins, lo cual es conveniente para los usuarios y puede limitar el alcance del uso de la herramienta por parte del usuario, incluida la transferencia a Parámetros para la herramienta CLI.

Enlace original: k8scat.com/posts/build…

Supongo que te gusta

Origin juejin.im/post/6943973550185250847
Recomendado
Clasificación