Typesafe配置HOCON - 环境变量替换列表的指导?

时间:2017-04-15 16:29:39

标签: playframework typesafe-config hocon

这是我最终使用的内容,因为我似乎无法将变量替换为良好的顺序。鉴于CORS Allowed Origins的Play Framework HOCON部分,它允许本地,开发,阶段和生产部署,并且不符合12因素:

play {
  # https://www.playframework.com/documentation/2.5.x/resources/confs/filters-helpers/reference.conf
  filters {
    # use default values for gzip, csrf & security headers
    # setup cors
    cors {
      # whitelist all paths
      pathPrefixes = ["/"]
      allowedOrigins = [
        "http://localhost:8080"
        "http://app.127.0.0.1.nip.io:8080"
        "http://app.192.168.64.2.nip.io"
        "http://app.192.168.42.173.nip.io"
        "http://app.terradatum.local"
        "http://app.dev.terradatum.com"
        "https://app.dev.terradatum.com"
        "http://app.stage.terradatum.com"
        "https://app.stage.terradatum.com"
        "http://app.terradatum.com"
        "https://app.terradatum.com"
      ]
    }
  }
}

我已经尝试了以下两种HOCON,环境设置也如下所示:

# HOCON
allowedOrigins = ${?APP_ALLOWED_ORIGINS}
# ENV
export APP_ALLOWED_ORIGINS='"http://app.127.0.0.1.nip.io:8080","http://app.192.168.64.2.nip.io","http://app.192.168.42.173.nip.io","http://app.terradatum.local","http://app.dev.terradatum.com","https://app.dev.terradatum.com","http://app.stage.terradatum.com","https://app.stage.terradatum.com","http://app.terradatum.com","https://app.terradatum.com"'

和...

# HOCON
allowedOrigins = [
  ${?APP_ALLOWED_ORIGINS}
  "http://app.127.0.0.1.nip.io:8080"
  "http://app.192.168.64.2.nip.io"
  "http://app.192.168.42.173.nip.io"
  "http://app.terradatum.local"
  "http://app.dev.terradatum.com"
  "https://app.dev.terradatum.com"
  "http://app.stage.terradatum.com"
  "https://app.stage.terradatum.com"
  "http://app.terradatum.com"
  "https://app.terradatum.com"
]
# ENV
export APP_ALLOWED_ORIGINS="http://some-new-cors.terradatum.com\nhttps://some-new-cors.terradatum.com\n"

许多其他CORS实现允许正则表达式,而WTH不会播放?

除此之外,HOCON列表处理对我来说非常有问题......上面的第一个实现工作正常,但是我在application.conf失败的现有默认列表的任何迭代...... / p>

通过环境变量替换向HOCON添加列表或列表项的推荐方法是什么?

1 个答案:

答案 0 :(得分:1)

如果我阅读你的帖子(我在那里看不到真正的“问题”)是正确的,那么你正试图找到一种方法来为你的CORS列表添加不同的值,具体取决于你的应用程序运行的环境。

我建议从另一个角度解决这个问题: 创建包含要自定义的值的不同配置文件,并包含常规application.conf文件。在部署配置中,make play加载阶段配置而不是application.conf。

e.g。如果您创建了dev-stage,请将其添加到您的部署配置中(假设您正在使用带有docker的sbt-native-packager)

javaOptions in Universal ++= Seq(
  "-Dconfig.resource=application.dev.conf"
)

你的application.dev.conf文件如下所示:

include "application.conf"
play.filters.cors {
      # whitelist all paths
      pathPrefixes = ["/"]
      allowedOrigins = [
        "http://localhost:8080"
        "http://app.127.0.0.1.nip.io:8080"
        "http://app.192.168.64.2.nip.io"
        "http://app.192.168.42.173.nip.io"
        "http://app.terradatum.local"
        "http://app.dev.terradatum.com"
        "https://app.dev.terradatum.com"

      ]
    }

问题是,你的环境变量不是列表而是字符串..在HOCON中没有将字符串拆分成列表的转换方法。

要遵循12因素方法,您可以尝试将列表(不断变化的部分)拆分为

ORIGIN_1=http://localhost:8080
ORIGIN_2=http://app.127.0.0.1.nip.io:8080

然后在您的配置中包含那些

play.filters.cors.allowedOrigins = [${?ORIGIN_1}] ${play.filters.cors.allowedOrigins}
play.filters.cors.allowedOrigins = [${?ORIGIN_2}] ${play.filters.cors.allowedOrigins}