以下是一个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
在范围内的魔力在编译同样的东西时也会生效贝壳。
答案 0 :(得分:8)
自版本0.13.6(2014-09-12)起,这不再是限制(#1059 / #1456)
原始答案 - 适用于任何使用sbt 0.13.0的项目 - 0.13.5
事实证明0.13.0 changes明确指出这是预期的行为:
所有定义都是在设置之前编译的,但将定义放在一起可能是最佳实践。目前,定义的可见性仅限于它所定义的.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