あなたが知らなかったGolangパッケージプロファイル|GoTheme Month

ご存知のとおり、GolangはCLIツールの作成に適していますが、Golangが構成ファイルをパッケージ化できることをご存じないかもしれません。

バックグラウンド

最近、Alibaba Cloud ECSの管理を含むCLIツールを作成しています。もちろん、AlibabaCloudリソース使用のセキュリティをここで考慮する必要があります。AlibabaCloudアカウントのAccessKeyIdとAccessKeySecretをのユーザーに配布できないようにする必要があります。 CLIツール。

アリババCload

したがって、ここでは、AccessKeyIdとAccessKeySecretを含む構成ファイルをCLIツールにパッケージ化することを選択します。デフォルトでは、CLIツールのユーザーはパッケージ化された構成ファイルを使用します。もちろん、構成を指定することで新しい構成ファイルを使用することもできます。ファイルまたは受け渡しパラメータ。構成情報。

達成

道具

ここでは、任意のファイルをGoコードに変換できるGolangライブラリを紹介します。このライブラリをgo-bindata使用して、バイナリファイルをGoプログラムに埋め込むことができます。また、生のバイトスライスに変換する前にファイルデータを圧縮するためにgzipがサポートされています。

ツールの具体的な紹介については、github.com /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パッケージ名を指定すると、呼び出しは次のように記述されます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ジョブと同様のビジュアルインターフェイスに再パッケージ化できます。これは、ユーザーにとって便利であり、ユーザーによるツールの使用範囲を制限できます。 CLIツールのパラメーター。

元のリンク:k8scat.com/posts/build…

おすすめ

転載: juejin.im/post/6943973550185250847