Почему "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