Почему "set" не может присвоить значение custom SettingKey, которое я могу "показать" в sbt-оболочке?

Ниже представлен проект sbt 0.13.1 с настраиваемой настройкой и значением для него:

% pwd
/Users/tisue/myproj
% ls
build.sbt
% cat build.sbt
val foo = settingKey[String]("This is a custom setting")

foo := "bar"
% sbt
[info] Set current project to myproj (in build file:/Users/tisue/myproj/)
> show foo
[info] bar

Пока все хорошо. Но теперь:

> set foo := "qux"
<set>:1: error: not found: value foo
foo := "qux"
^
[error] Type error in expression

Разве это не работает?

Я частично понимаю, что здесь происходит неправильно; set оценивает выражение Scala, и это выражение, по-видимому, компилируется в контексте, в котором val foo не входит в область видимости.

Но я ожидал бы, что магия, которая обеспечивает foo, в области видимости, когда foo := ... скомпилирована из файла .sbt, также будет действовать, когда одна и та же вещь будет скомпилирована в оболочке.

Ответ 1

Начиная с версии 0.13.6 (2014-09-12) это уже не ограничение (# 1059/# 1456)


Оригинальный ответ - для любых проектов, использующих sbt 0.13.0 - 0.13.5

Как оказалось 0.13.0 изменения четко указывают, что это ожидаемое поведение:

Все определения скомпилированы перед настройками, но, вероятно, лучше всего будет устанавливать определения вместе. В настоящее время видимость определений ограничена .sbt файлом, в котором он определен. Они не отображаются в команде consoleProject или set в это время. Используйте Scala файлы в проекте/для видимости во всех файлах .sbt.

При этом вы сможете поделиться настройкой после определения в project/Build.scala следующим образом:

import sbt._
import Keys._

object HelloBuild extends Build {
  lazy val foo = settingKey[String]("This is a custom setting")

  foo := "Build.scala"
}

build.sbt

scalaVersion := "2.10.4-RC1"

foo := "build.sbt"

Затем в sbt shell:

[sbt-0-13-1]> foo
[info] build.sbt
[sbt-0-13-1]> set foo := "shell"
[info] Defining *:foo
[info] The new value will be used by no settings or tasks.
[info] Reapplying settings...
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/)
[sbt-0-13-1]> foo
[info] shell