14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Go言語で設定ファイルの一部を環境変数で置換

Last updated at Posted at 2014-12-24

Go製ツールwalterの設定ファイルpipeline.ymlで値を環境変数から取りたいなあと思ったのでトライ。

とりあえず"text/template"で環境変数を使える体まで書いたのでメモ。

まず環境変数をまるごとマップに

Goでは環境変数の一覧をos.Environ()で取れるんだけど、キーバリュー込みで1つの単位になるテキストのスライスをもらえるだけなので、そのままでは扱いづらい。

じゃあまずマップに変換してみようと。

github.com/higanworks/envmap

参考にしたのはこちらの記事 Get environment variables as a map in golang - coderwall

ライブラリの内容はこちら。

package envmap

import (
	"os"
	"strings"
)

// 全部入りのマップを返す
func All() map[string]string {
	data := os.Environ()
	items := make(map[string]string)
	for _, val := range data {
		splits := strings.SplitN(val, "=", 2)  // `=`で分割、分割数を2にして値側の`=`を無視
		key := splits[0]
		value := splits[1]
		items[key] = value
	}
	return items
}

// キーの一覧を返す
func ListKeys() []string {
	data := os.Environ()
	var keys []string
	for _, val := range data {
		splits := strings.SplitN(val, "=", 2)  // `=`で分割、分割数を2にして値側の`=`を無視
		keys = append(keys, splits[0])
	}
	return keys
}

事前の仕込みはこれでよし。

yamlの文字列をtext/templateで処理

変換したいところをヒゲで囲んだhoge.ymlを用意した。今回はドットのあとに代入したい環境変数。

hoge.yml
message:
 hoge: Hello {{.HOME}}

で、template - The Go Programming Languageを見ながら処理を書いた。

main.go
package main

import (
	"github.com/higanworks/envmap"
	"io/ioutil"
	"os"
	"text/template"
)

func main() {
	envs := envmap.All() // 環境変数マップを取得

	rawdata, err := ioutil.ReadFile("hoge.yml")
	if err != nil {
		panic(err)
	}

	tmpl, err := template.New("test").Parse(string(rawdata))
	if err != nil {
		panic(err)
	}

	err = tmpl.Execute(os.Stdout, envs) // 置換して標準出力へ
	if err != nil {
		panic(err)
	}

}

実行して、置換後の出力。

hoge.yml(output)
---
message:
 hoge: Hello /Users/sawanoboly

できたわー。

ちなみにコードこのままだと、環境変数が無かったら<no value>で埋められちゃう。

hoge.yml(output_with_no_value)
---
message:
 hoge: Hello <no value>

もしかすると"text/template"のActionsだけでも何とかなりそうだけど、yaml側に色々書くのも変だし。

おすすめGo

この2つにお世話になりました。

14
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?