使用Typesafe Config的ConfigFactory在build.sbt中设置密钥设置?

blo*_*loo 15 scala sbt

sbt.version = 0.13.1

build.sbt我通过调用我的项目依赖项代码来分配设置键,然后通过Typesafe Config配置自己的代码ConfigFactory.我的依赖有一个reference.conf罐子里的根,我的项目本身包含一个压倒一切application.confsrc/main/resources.

lib/dependency也是我的代码,顺便说一句.

import com.mylib.Finders
import com.myproj.sbt.Keys._

projKeyColorSetting in Compile := Finders.findColor // this calls ConfigFactory.load

seq(projSettings:_*)
Run Code Online (Sandbox Code Playgroud)

构建甚至没有加载,因为它找不到我试图在我的lib代码中引用的第一个conf键.

我在构建文件中尝试了一些范围和类路径操作的组合,但无济于事.我假设jar reference.conf会出现在Compile作用域的类路径上,但它不能像我预期的那样工作.

昨天我花了大部分时间仔细阅读有关Classpath,Scopes,Keys,Tasks和ResourceGenerators的SBT文档 - 我的目的是执行一个依赖于以下projKeyColorSetting设置的自定义插件build.sbt:

lazy val projSettings = inConfig(Compile) {
    Seq(
        resourceGenerators in Compile <+= Def.task {
            val fileCreated = createColorFile(projKeyColorSetting.value)
            Seq(fileCreated)
        }
    )
 }
Run Code Online (Sandbox Code Playgroud)

Hav*_*c P 7

如果你从foo.jar获得一个类,那么ConfigFactory.load()应该在同一个jar中找到一个reference.conf.如果没有,那么有些事情是错的,但很难猜到是什么.可能是reference.conf中可能存在一些无效的语法; 可能是reference.conf不在jar中; 可能是reference.conf在子目录而不是jar的根目录中; 很难猜到.我试着-Dconfig.trace=loads在那里寻找问题(它应该告诉你配置是否试图加载reference.conf).您也可以自己动手classLoader.getResources,看看是否可以找到没有配置的文件.您也可以尝试ConfigFactory.parseResourcesAnySyntax("reference")查看您的参考设置是否在那里,然后尝试ConfigFactory.load直接调用并查看您的设置是否在那里.一般来说,仔细检查所有假设并查看它出错的地方.

至于如何添加src/main/resources,两个基本策略是1)以某种方式在类路径上获取它(在这种情况下可能很难;你甚至在启动sbt之前需要它或者需要做某种事情自定义ClassLoader乐趣)或可能更实用2)手动加载它ConfigFactory.parseFile().

我可能会抓住resourceDirectory密钥作为您的任务的依赖项,然后执行类似(未经测试)的操作:

myTask := {
   val resourceDir = (resourceDirectory in Compile).value
   val appConfig = ConfigFactory.parseFile(resourceDir / "application.conf")
   val config = ConfigFactory.load(appConfig) // puts reference.conf underneath
   Finders.findColor(config)
}
Run Code Online (Sandbox Code Playgroud)

请注意,这涉及更改find​​Color以获取Config参数,或者您可能希望使Finders成为可以使用Config; 构造的非单例; 请参阅https://github.com/typesafehub/config/blob/master/examples/scala/simple-lib/src/main/scala/simplelib/SimpleLib.scala#L22上的示例,其中我试图说明使用时一个Config通常国会图书馆应该都默认ConfigFactory.load,但也有一个构造函数,允许自定义Config为这样的情况.

  • 请记住,对于项目foo,类路径和deps位于foo/*.sbt和foo/project/*.scala中.构建本身也是一个项目,因此foo的构建在foo/project/*.sbt和foo/project/project/*.scala中定义了deps和classpath.所以foo/project中的.sbt文件引用构建程序,foo/project中的.scala文件引用foo程序. (2认同)