如何用SBT进行抽象?

How to abstract with 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

不计算。

我调整了一些东西以获得 2 个可能的替代方案来评估:

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-none 尝试了各种版本,其中有效:(。必须有更好的方法来使用 SBT 进行抽象!

你能帮忙吗?

在您的原始示例周围使用 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