LoginSignup
28
18

More than 5 years have passed since last update.

typesafe configについてチョットまとめた

Last updated at Posted at 2018-01-04

typesafe config

typesafe(今はlightbend)が作ったconfig読み込みライブラリ

前置き

  • 自分自身がなんとなく使っていたものなので、整理しようと書きました
  • Scalaで使ってます

なに?

  • 依存ライブラリなしのjavaで書かれた設定系ライブラリ
  • JSON(.json)で書いたり、HOCON(.conf)で書いた設定ファイルをアプリケーションに読み込める

使うには

build.sbtに書こう

libraryDependencies += "com.typesafe" % "config" % "1.3.1"

ConfigFactory.loadでconfigファイルを読み込む。

帰ってきたconfigオブジェクトから設定したキーから値を取得して使用できる

Configオブジェクトにはget~のメソッドがあり、configファイルに書いたものを型を指定して読み込むことができる。読み込んだとき、メソッドと実際の値の型が違えばエラーになる

コードにすると↓になる

import com.typesafe.config.ConfigFactory

object ConfigSample {
  def main(args: Array[String]): Unit = {
    val config: Config = ConfigFactory.load()

    config.get~("path") // 設定値を~型として使って読み取る
    // String, Int, Enum, Boolean, etc...

    val subconf: Config = config.getConfig("subconfig")

    // 下のようなconfファイルがあったとき
    // subconfにはsubconfigをルートにしたConfigオブジェクトが返される
    // なので`subconf.getString("host")`では"sub_host"が返る
   /*
   * # application.conf
   * host = "main_host"
   * subconfig {
   *        host = "sub_host"
   * }
   */

  }
}

なにが読み込まれるの?

ファイルパスのconfigの内容

ConfigFactory.load("ファイル名") // ファイル名には拡張子を含めない

src/main/resources以下の application.conf, application.json, application.properties, reference.confとシステムプロパティ

application.conf > application.json > application.properties > reference.conf

で設定値は優先される

reference.confは一番後回しにして読み取られるので、ライブラリなんか作るときはにデフォルト値を書いておくといいらしい。

include

  • confファイルならinclude "ファイル名"で指定したファイルの設定もincludeを書いたファイルに取り込める。 includeしてきたファイルとしたファイルで同じキーの設定値があった場合した側の設定値が優先される
  • includeするファイルはconfファイルでなくていい(json, propertiesでOK)
a.conf

a = "a"


application.conf
include "a"

b = "b"

val config = ConfigFactory.load()
config.getString("a") // a
config.getString("b") // b

置換

プロパティ名 = ${置換元プロパティ名}

application_host = "untarakantara.com"

application_url = "https://${application_host}"
ConfigFactory.load().getString("application_url") // `https://untarakantara.com`

環境変数から置換

プロパティ名 = ${?環境変数}
環境変数がなく、環境変数名と同じなプロパティ名を持った値がconfに設定されてたらそれが使われる

password = ${?PASS_WORD}
28
18
0

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
28
18