Typesafe config HOCON - 环境变量列表替换指南?
Typesafe config HOCON - guidance for environment variable replacement of lists?
这是我最终使用的,因为我似乎无法以良好的顺序进行变量替换。鉴于 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
中有一个现有的默认列表的任何迭代都失败了.. .
通过环境变量替换将列表或列表项添加到 HOCON 的推荐方法是什么?
如果我读到你的 Post(我在那里没有看到真正的 "question")是正确的,你正在尝试找到一种方法来向你的 CORS 列表添加不同的值,具体取决于您的应用在哪个环境中 运行。
我建议从另一个角度来解决这个问题:
创建不同的配置文件,其中包含您要自定义的值并包括常规 application.conf 文件。在您的部署配置中,让 play 加载您的暂存配置而不是 application.conf。
例如如果你创建你的开发阶段,将它添加到你的部署配置中(假设你使用 sbt-native-packager 和 docker)
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}
这是我最终使用的,因为我似乎无法以良好的顺序进行变量替换。鉴于 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
中有一个现有的默认列表的任何迭代都失败了.. .
通过环境变量替换将列表或列表项添加到 HOCON 的推荐方法是什么?
如果我读到你的 Post(我在那里没有看到真正的 "question")是正确的,你正在尝试找到一种方法来向你的 CORS 列表添加不同的值,具体取决于您的应用在哪个环境中 运行。
我建议从另一个角度来解决这个问题: 创建不同的配置文件,其中包含您要自定义的值并包括常规 application.conf 文件。在您的部署配置中,让 play 加载您的暂存配置而不是 application.conf。
例如如果你创建你的开发阶段,将它添加到你的部署配置中(假设你使用 sbt-native-packager 和 docker)
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}