【发布时间】:2020-08-10 02:37:39
【问题描述】:
错误信息
`value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting.
val x = version.value
^
明确指出如何解决问题,例如使用:=
val x = settingKey[String]("")
x := version.value
sbt uses macros heavily状态中的解释
value方法本身实际上是一个宏,如果你调用它 在另一个宏的上下文之外,将导致编译时间 错误,确切的错误信息是... 你可以看到为什么,因为 sbt 设置完全是声明性的,你 无法从键中访问任务的值,这没有意义 这样做。
但是我很困惑 sbt 的声明性性质是什么意思。例如,直觉上我会认为以下 vanilla Scala sn-p 在语义上类似于 sbt 的
def version: String = ???
lazy val x = s"Hello $version" // ok
trait Foo {
def version: String
val x = version // ok
}
由于这是合法的,显然 Scala sn-p 在语义上并不等同于 sbt。我想知道是否有人可以详细说明为什么value 不能在宏之外使用?原因纯粹是与宏语法相关的语法,还是我遗漏了一些关于 sbt 本质的基本知识?
【问题讨论】:
标签: scala sbt scala-macros