使用 typesafe/akka config 合并多级配置

merging multiple levels of configuration using typesafe/akka config

我在看: https://github.com/typesafehub/config

假设我想要一个默认配置,例如reference.conf,然后我想要 dev/prod 覆盖(两个不同的 application.conf),然后我还希望拥有从 [=36= 继承的特定于主机的覆盖] 和最终的默认值 reference.conf。我该怎么做?

例如,我正在想象一个类似这样的目录结构:

resources/reference.conf
resources/prod/application.conf
resources/prod/master.conf
resources/prod/slave.conf
resources/dev/application.conf
resources/dev/master.conf
resources/dev/slave.conf

或者可能是 resources/dev/master/application.conf?

我会在某个地方指定一个环境,即可能从启动应用程序的主机名中提取。

如果应用程序是 master.dev.example.com,我希望我应该能够做类似的事情:

getConfigurations("dev/master.conf").withDefaultsFrom(
    getConfigurations("dev/application.conf").withDefaultsFrom(
        getConfigurations("resource.conf"))

但是我很难理解使用给定的库会是什么样子。

我知道我可以设置一个 config.resource 系统 属性,但它看起来只允许一级覆盖,dev-application.conf -> resources.conf, 而不是像 master-node.conf -> dev-application.conf -> resources.conf.

我看到了一个 .withFallback 方法,但如果我想在一个文件中混合两种配置,而不是将 resources/files 链接在一起。

首先使用多个 withFallback,优先级最高的配置。例如:

Config finalConfig = 
  ConfigFactory.systemProperties().
    withFallback(masterConfig).
    withFallback(applicationConfig).
    withFallback(referenceConfig)

masterConfig 这样的每个配置都会加载 Config.parseFile。您也可以使用 ConfigFactor.load 来方便,但 parseXXX 方法可以让您更好地控制层次结构。