【问题标题】:How to pass a different config file while running sbt?如何在运行 sbt 时传递不同的配置文件?
【发布时间】:2016-12-12 20:10:06
【问题描述】:

在 sbt 中,是否可以传递不同的配置文件来使用?

sbt run

这将使用默认配置文件 application.conf

我希望能够在开发过程中在不同的配置文件之间切换,如何在 sbt 内部将其作为参数传递。

【问题讨论】:

  • 如果你的意思是在运行 sbt 之前传递参数,那就是sbt "run -Dconfig.resource=application.test.conf"。如果您的意思是当您在 sbt 控制台中时,我将不得不挖掘更多..

标签: scala sbt akka


【解决方案1】:

您可以使用-D 标志覆盖配置文件中所需的任何特定属性。这从 1.0.1 afaik 版本开始可用。示例:

sbt run -D akka.cluster.seed-nodes=["akka.tcp://TestApp@host1:2552", "akka.tcp://TestApp@host2:2552"]

这将替换 application.conf 持有的任何值:

akka {
  cluster {
    seed-nodes = ["", "", /// etc]
  }
}

或者,如果您想覆盖整个配置,请执行以下操作:

val runtimeMxBean = ManagementFactory.getRuntimeMXBean
val arguments = runtimeMxBean.getInputArguments.asScala.toList

val config = arguments.find(_.contains("config.path")) match {
  case Some(value) => {
   val opt = value.split("=")
   if (Files.exists(opt.last)) {
     ConfigFactory.load(opt.last)
   } else {
     ConfigFactory.load("application.conf")
   }
  case None => ConfigFactory.load("application.conf")
}
  • 使用-D传递文件路径做你的配置文件,例如config.path=...
  • 加载配置时,您需要检查是否提供了指定文件路径的运行时参数,检查文件是否存在,然后加载该文件。

更新:选项 3:使用 config.resource

如果您需要加载一个完全独立的配置文件,您可以使用-Dconfig.resource=filepath 覆盖整个配置文件。

选项 4

您还可以使用环境变量覆盖配置选项的特定值。它看起来像这样:

database {
  host = "localhost"
  host = ${?DATABASE_HOST}
}

这意味着如果设置了 DATABASE_HOST 环境变量,它的值将用于覆盖 application.conf 已经为该键保存的任何内容。

【讨论】:

    【解决方案2】:

    也可以使用-Dsbt中添加外部resources文件夹,示例(添加到build.sbt,如果使用模块,这个也应该添加到模块中):

    val myResourceDirectory = Option(System.getProperty("myResourceDirectory")).getOrElse("hello_world")
    unmanagedResourceDirectories in Compile += baseDirectory.value / myResourceDirectory
    

    将特定的myResourceDirectory 添加到unmanagedResourceDirectories 中,因此用法可能如下:

    sbt -DmyResourceDirectory=myfolder/local //local
    sbt -DmyResourceDirectory=myfolder/dev //dev
    sbt -DmyResourceDirectory=myfolder/prod //prod
    

    【讨论】:

    • 如果我使用模块你是什么意思?
    • @Blankman,我的意思是如果您在项目中使用子模块,并且您还想在子模块中应用myResourceDirectory,您还需要在子模块设置中添加unmanagedResourceDirectories in Compile += baseDirectory.value / myResourceDirectory
    猜你喜欢
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2014-06-01
    • 2022-01-22
    • 2017-02-20
    • 2015-09-05
    相关资源
    最近更新 更多