繁体   English   中英

Scala:如何使用 scala 将环境变量加载到 Application.conf 中?

[英]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 使用不同的数据库。

  1. 我不知道它如何找到包含 prd.env 和 dev.env 的 Meta 目录(见图)。
  2. 我不知道它是如何判断环境是在 dev 还是 prd 中。
  3. 现在的目标是部署这个应用程序,这就是为什么我需要这些环境变量才能工作。

我非常感谢所有帮助,但请尝试详细说明您的答案,因为我真的很困惑,而且简短的答案通常假设我比我知道的更多。 谢谢:)

相关的技术堆栈:

  • HTTP4S,
  • 猫,
  • 杜比,
  • PostgreSQL

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM