Сообщение об ошибке
`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 интенсивно используются макросы состояний
Сам метод value
на самом деле является макросом, который, если вы вызываете его вне контекста другого макроса, приведет к ошибке времени компиляции, точному сообщению об ошибке быть ... И вы можете понять, почему, поскольку настройки sbt полностью декларативны, вы не можете получить доступ к значению задачи из ключа, это не имеет смысла.
однако меня смущает то, что подразумевается под декларативной природой sbt, являющейся причиной. Например, интуитивно я думаю, что следующий ванильный Scala фрагмент семантически похож на sbt
def version: String = ???
lazy val x = s"Hello $version" // ok
trait Foo {
def version: String
val x = version // ok
}
Поскольку это допустимо, ясно, что фрагмент Scala не является семантически эквивалентным sbt. Мне было интересно, если кто-то может уточнить, почему value
нельзя использовать вне макросов? Является ли причина чисто syntacti c связанной с макросинтаксисом или я упускаю что-то фундаментальное в природе sbt?