如何用SBT进行抽象?

时间:2015-06-11 04:23:43

标签: scala sbt

我有一个build.sbt文件,其中包含以下代码段:

scalastyleConfig in Compile := baseDirectory.value / "project" / "scalastyle_config.xml"
scalastyleConfig in Test := baseDirectory.value / "project" / "scalastyle_config.xml"

当我使用IntelliJ来提取变量时,我得到:

val scalaStyleConfig: File = baseDirectory.value / "project" / "scalastyle_config.xml"
scalastyleConfig in Compile := scalaStyleConfig
scalastyleConfig in Test := scalaStyleConfig

不评估。

我调整了一些东西,以获得两种可能的评估方法:

val scalastyleConfigFile = SettingKey[File]("scalaStyleConfig")
scalastyleConfigFile := baseDirectory.value / "project" / "scalastyle_config.xml"
scalastyleConfig in Compile := scalastyleConfigFile.value
scalastyleConfig in Test := scalastyleConfigFile.value

或:

def scalastyleConfigFile(baseDir: File) = baseDir / "project" / "scalastyle_config.xml"
scalastyleConfig in Compile := scalastyleConfigFile(baseDirectory.value)
scalastyleConfig in Test := scalastyleConfigFile(baseDirectory.value)

我对其中任何一种选择都不满意。我现在正在使用第二种替代品,因为它更短。令人讨厌的是必须将baseDirectory.value作为参数传递给函数。

我使用lazy val尝试了各种版本 - 没有一个工作:(。必须有更好的方法来抽象SBT!

你能帮忙吗?

1 个答案:

答案 0 :(得分:3)

在原始示例周围使用Def.setting { }

val scalaStyleConfig: File = Def.setting { baseDirectory.value / "project" / "scalastyle_config.xml" }
scalastyleConfig in Compile := scalaStyleConfig.value
scalastyleConfig in Test := scalaStyleConfig.value

原因是:=Def.setting是编译时宏,只能在正确的设置下工作。

有关详细说明,请参阅http://www.scala-sbt.org/0.13/docs/ChangeSummary_0.13.0.html#New+task%2Fsetting+syntax