前言
プロジェクト開発中には、さまざまな環境を切り替える必要があります。そのため、通常は異なる環境変数を設定します。ただし、プログラム内に直接固定値を書き込むと、変更が非常に面倒です。環境変数を動的に渡すことができれば、不要な変更を大幅に減らし、プログラムもよりクリーンになります。
flag
通常、golangではflagパッケージを使用して同様の効果を実現できます。例えば:
var env string
var accessToken string
func main() {
flag.StringVar(&env, 'ENV', 'development', 'your current env')
flag.StringVar(&accessToken, 'ACCESS_TOKEN', 'xxx-oo-ooo', 'your API access token')
flag.Parse()
// アプリケーションを起動する
}
または、この記事で言及されている方法を参考に、go build -ldflag
を使用して変数をコンパイル時に設定することもできます。
これにより、プログラム内で値を直接書き込む必要はなくなりますが、変数は事前に定義する必要があります。
YAMLを使用して読み込む
上記の問題を解決するために、環境変数を統一的に管理するために、yaml(またはお好みの形式)を使用することができます。例えば:
func LoadEnv(filename string) bool {
file, err := ioutil.ReadFile(filename)
if err != nil {
// 本番環境では、コンソールで直接環境変数を設定することもあります
return false
}
var config := make(map[string]string)
yaml.Unmarshal(file, &config)
for k, v := range config {
os.Setenv(k, v)
}
}
yamlの変数を読み込んだ後、os.Setenv(k, v)
を使用して一元的に保存します。これにより、ローカル環境で変数を簡単に調整できるようになります。設定を無視するようにしておくことを忘れないでください。そうしないと、変数に機密情報が含まれていて、かつ公開されているリポジトリの場合、情報漏洩のリスクがあります。
後記
この問題を解決するために、非常にシンプルなリポジトリを作成しました。開発上本当に必要な場合は、引き続き最適化を行ってください。XD