Почему "set" не может присвоить значение пользовательской SettingKey, которую я могу "показать" в оболочке 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 file, также будет действовать, когда то же самое будет скомпилировано в оболочке.

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:

[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
Другие вопросы по тегам