Lambdaカクテル

Common Lispを書くMT-03ライダー(初心者)です

ScalaのTypesafe config(Lightbend config)で環境変数を含んだ文字列を設定する

ScalaにはTypesafe config(今はTypesafeはLightbendという社名になっているのでLightbend configかもしれない)という便利な設定ファイルライブラリがあり,ScalaのWebアプリケーションフレームワークであるPlay frameworkでは標準的に採用されている。これはHOCONというシンタックス*1で設定を記述することができ,アプリケーション側からも容易に設定を呼び出すことができるので便利だ。

Typesafe config 例

// application.conf
db.default.user="piyopiyo"

上記のように設定ファイルを記述して,

import com.typesafe.config.ConfigFactory

val conf: Config = ConfigFactory.load();

val s: String = conf.getString("db.default.user");

上記のようにScalaコードを書くことで,文字列spiyopiyoが入る。DBの接続先やS3バケット名などを入力できて便利。

環境変数を注入する

ところでアプリケーションによっては環境変数から設定の値を作りたいということがある。例えば接続するDB名を環境によって切り替えたい,といった場合だ。例えば以下のような場合。

db.default.url="jdbc:mysql://mysql:3306/ここになんか環境変数が入る"

こういった場合は素直にダブルクォートの中に${APP_ENV}みたいなものを入れたいのだが,それでは動かない。

// これでは動かない!
db.default.url="jdbc:mysql://mysql:3306/${APP_ENV}"

正しい記述は以下のとおりだ:

// 単純に併記する
db.default.url="jdbc:mysql://mysql:3306/"${APP_ENV}

文字列をまず書いて,それに併記して環境変数を記述する。すると文字列が結合される。奇妙な記述だが,こういうものだ。プログラミング言語のノリだとこれで結合されるのは直感的ではないが,これは設定ファイルのDSLなのでと自分を納得させることができれば,この記法に違和感を感じなくなるだろう。おそらくJSONや.propertiesのスーパーセットとして定義されているゆえの制限なのだろう。

おわり

github.com

*1:なんでもJSONと.propertiesのスーパーセットらしい。