我想创建一个使用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
似乎没有考虑到(我也尝试过不同的范围,如Compile
或Test
).结果,任务因失败而失败com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'localDb'
.
我该如何解决这个问题,以便配置可用?
我在这里发现了很多关于使用application.conf
内部问题的问题build.sbt
,但这不是我需要的.
因此,即使您的代码驻留在您的src
-folder 中,它也会从 SBT 中调用。application.conf
这意味着,您正在尝试从SBT 的类路径上下文中加载您的文件。
Slick在内部使用 Typesafe Config
。(因此下面的方法(在后台描述)不适用,因为您无法修改 Config 加载机制本身)。
application.conf
相反,尝试通过显式设置路径config.resource
,请参阅类型安全配置文档(搜索 config.resource)
在开始之前设置config.resource
(通过 -Dconfig.resource=...)sbt
或者从 build.sbt 中作为 Scala 代码
sys.props("config.resource") = "./src/main/resources/application.conf"
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 中的内容。project
ClassLoader
最后,我创建了一个testenvironment.conf
inproject
文件夹并使用以下代码加载(类型安全)配置:
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)