[英]How to use Environment Variables and application.conf files in Scala?
[英]Scala: How to load environment variables into Application.conf using scala?
我有一個 ConfigLoader,我很確定它可以正常工作。 我懷疑我沒有正確使用 application.conf 文件,或者我的包含 prd.env 和 dev.env 的目錄不在正確的位置。
我期望發生的事情:
我在輸入sbt run
ConfigLoader 讀取 application.conf 文件,看到該文件中有變量。 然后根據它所在的環境檢查prd.env還是dev.env,然后最后加載變量。 我想要這個,所以我可以為 dev 和 prd 使用不同的數據庫。
我非常感謝所有幫助,但請嘗試詳細說明您的答案,因為我真的很困惑,而且簡短的答案通常假設我比我知道的更多。 謝謝:)
相關的技術堆棧:
application.conf 文件如下:
appone {
environment = ${ENV}
server-config {
url = ${?BASE_URL}
host = "0.0.0.0"
port = 8080
}
db-config {
driver = "org.postgresql.Driver"
url = ${?DATABASE_URL}
user = ${?APPONE_POSTGRES_USER}
password = ${?PASSWORD}
connection-threads = 4
}
}
Meta/dev.env 文件(我也有一個 Meta/prd.env 但由於內容而在此處顯示)
ENV=dev
BASE_URL=http://localhost:8080/
DATABASE_URL=jdbc:postgresql://localhost:5400/bookswapdb
APPONE_POSTGRES_USER=su
PASSWORD=password
加載配置文件如下:
package com.fullstackryan.appone.config
import cats.ApplicativeError
import cats.implicits._
import pureconfig.error.ConfigReaderException
import pureconfig.{ConfigReader, ConfigSource, Derivation}
import shapeless.the
trait LoadConfig[F[_], TConfig] {
def load: F[TConfig]
}
object LoadConfig {
def load[F[_], TConfig](implicit loadConfig: LoadConfig[F, TConfig]): F[TConfig] =
the[LoadConfig[F, TConfig]].load
def apply[F[_], TConfig](
implicit reader: Derivation[ConfigReader[TConfig]], ae: ApplicativeError[F, Throwable]
): LoadConfig[F, TConfig] =
new LoadConfig[F, TConfig] {
def load: F[TConfig] = ApplicativeError[F, Throwable].fromEither {
ConfigSource.default
.at("appone")
.load[TConfig]
.leftMap(ConfigReaderException(_))
}
}
}
錯誤
pureconfig.error.ConfigReaderException: Cannot convert configuration to a scala.runtime.Nothing$. Failures are:
at 'appone.db-config':
- (application.conf @ jar:file:/Users/ryanmcavoy/fullStackRyan/appone/target/bg-jobs/sbt_3cc4b1f5/job-11/target/419ddc2c/5befcb57/appone_2.13-0.0.1-SNAPSHOT.jar!/application.conf: 10) Key not found: 'url'.
- (application.conf @ jar:file:/Users/ryanmcavoy/fullStackRyan/appone/target/bg-jobs/sbt_3cc4b1f5/job-11/target/419ddc2c/5befcb57/appone_2.13-0.0.1-SNAPSHOT.jar!/application.conf: 10) Key not found: 'username'.
- (application.conf @ jar:file:/Users/ryanmcavoy/fullStackRyan/appone/target/bg-jobs/sbt_3cc4b1f5/job-11/target/419ddc2c/5befcb57/appone_2.13-0.0.1-SNAPSHOT.jar!/application.conf: 10) Key not found: 'pool-size'.
at com.fullstackryan.appone.config.LoadConfig$$anon$1.$anonfun$load$1(LoadConfig.scala:25)
at cats.syntax.EitherOps$.leftMap$extension(either.scala:172)
at com.fullstackryan.appone.config.LoadConfig$$anon$1.load(LoadConfig.scala:25)
at com.fullstackryan.appone.server.ApponeServer$.$anonfun$stream$1(ApponeServer.scala:32)
at com.fullstackryan.appone.server.ApponeServer$.$anonfun$stream$1$adapted(ApponeServer.scala:31)
at fs2.Stream$.$anonfun$flatMap$1(Stream.scala:1188)
at fs2.internal.FreeC$.go$2(Algebra.scala:609)
at fs2.internal.FreeC$.$anonfun$flatMapOutput$1(Algebra.scala:616)
at fs2.internal.FreeC$$anon$1.cont(Algebra.scala:53)
at fs2.internal.FreeC$ViewL$$anon$9$$anon$10.cont(Algebra.scala:242)
at fs2.internal.FreeC$ViewL$.mk(Algebra.scala:231)
at fs2.internal.FreeC$ViewL$.apply(Algebra.scala:220)
at fs2.internal.FreeC.viewL(Algebra.scala:106)
at fs2.internal.FreeC$.go$1(Algebra.scala:414)
at fs2.internal.FreeC$.$anonfun$compile$8(Algebra.scala:464)
at fs2.internal.FreeC$.$anonfun$compile$1(Algebra.scala:430)
addSbtPlugin("io.github.davidgregory084" % "sbt-tpolecat" % "0.1.14")
addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.10")
addSbtPlugin("au.com.onegeek" % "sbt-dotenv" % "2.1.204")
// deploy heroku
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.7.6")
addSbtPlugin("com.heroku" % "sbt-heroku" % "2.1.0")
查看錯誤在哪里顯示application.conf: Key not found: 'username'
? 這意味着它正在該application.conf
文件中尋找一些username
,但沒有找到它。 如果您自己查看application.conf
文件,您會發現其中確實沒有名為username
的設置。 有一個叫做user
,也許這就是你的意圖?
我們還看到Key not found: 'pool-size'
,看起來也沒有設置。
最后,它說Key not found: 'url'
。 您的application.conf
中有兩個url
鍵,這意味着代碼不在配置文件的正確部分。 當您希望它正在尋找appone.url
appone.db-config.url
。
通過sbt run
時,環境由 shell 設置,您在其中運行 sbt。 自己定義一個dev.env
文件什么都不做。
設置運行 sbt 的環境的機制將根據您的 shell 而有所不同。
例如,如果 bash 是您的 shell (這值得在其他 Bourne 兼容的 shell 中嘗試),在環境變量前面加上export
,例如:
export ENV=dev
然后,您將從dev.env
導出的環境變量合並到您的 bash 環境中
source meta/dev.env
然后將設置這些環境變量,並在您的 shell session 期間將這些環境變量合並到您的配置中(即,它們將繼續跨多個sbt run
,直到您退出 shell。 如果您更改dev.env
,在您再次獲取source meta/dev.env
之前,它們將不可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.