如何在自定义sbt任务中通过application.conf进行Slick配置?

ag5*_*ag5 7 scala sbt slick

我想创建一个使用slick创建数据库模式的set任务.为此,我在我的项目中有一个如下的任务对象:

object CreateSchema {

    val instance = Database.forConfig("localDb")

    def main(args: Array[String]) {
        val createFuture = instance.run(createActions)
        ...
        Await.ready(createFuture, Duration.Inf)
    }

}
Run Code Online (Sandbox Code Playgroud)

在我的build.sbt定义任务中:

lazy val createSchema = taskKey[Unit]("CREATE database schema")

fullRunTask(createSchema, Runtime, "sbt.CreateSchema")
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行时,它会按预期执行sbt createSchema.

然而,问题是application.conf似乎没有考虑到(我也尝试过不同的范围,如CompileTest).结果,任务因失败而失败com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'localDb'.

我该如何解决这个问题,以便配置可用?

我在这里发现了很多关于使用application.conf内部问题的问题build.sbt,但这不是我需要的.

Mar*_*nne 1

回答

因此,即使您的代码驻留在您的src-folder 中,它也会从 SBT 中调用。application.conf这意味着,您正在尝试从SBT 的类路径上下文中加载您的文件。

Slick在内部使用 Typesafe Config。(因此下面的方法(在后台描述)不适用,因为您无法修改 Config 加载机制本身)。

application.conf相反,尝试通过显式设置路径config.resource请参阅类型安全配置文档(搜索 config.resource)

选项1

在开始之前设置config.resource(通过 -Dconfig.resource=...)sbt

选项2

或者从 build.sbt 中作为 Scala 代码

sys.props("config.resource") = "./src/main/resources/application.conf"

选项3

Task或者在 SBT 中创建一个

lazy val configPath = TaskKey[Unit]("configPath", "Set path for application.conf")
Run Code Online (Sandbox Code Playgroud)

并添加

configPath := Def.task {
  sys.props("config.resource") = "./src/main/resources/application.conf"
}
Run Code Online (Sandbox Code Playgroud)

到您的设置顺序。

如果有效,请告诉我。

背景资料

最近,我正在为 SBT 编写一个自定义插件,我也尝试访问 a reference.conf. 不幸的是,我无法使用默认的 .subfolder访问任何.conf放置在-subfolder 中的内容。projectClassLoader

最后,我创建了一个testenvironment.confinproject文件夹并使用以下代码加载(类型安全)配置:

def getConfig: Config = {
  val classLoader = new java.net.URLClassLoader( Array( new File("./project/").toURI.toURL ) )
  ConfigFactory.load(classLoader, "testenvironment")
}
Run Code Online (Sandbox Code Playgroud)

application.conf或者从以下位置加载一般内容./src/main/resources

def getConfig: Config = {
  val classLoader = new java.net.URLClassLoader( Array( new File("./src/main/resources/").toURI.toURL ) )
  // no .conf basename given, so look for reference.conf and application.conf
  // use specific classLoader
  ConfigFactory.load(classLoader)
}
Run Code Online (Sandbox Code Playgroud)