我有一个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!
你能帮忙吗?
答案 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。