为什么"设置"无法为自定义SettingKey分配值我可以"显示"在sbt shell?

时间:2014-01-03 04:09:45

标签: scala 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 :(得分:8)

自版本0.13.6(2014-09-12)起,这不再是限制(#1059 / #1456


原始答案 - 适用于任何使用sbt 0.13.0的项目 - 0.13.5

事实证明0.13.0 changes明确指出这是预期的行为:

  

所有定义都是在设置之前编译的,但将定义放在一起可能是最佳实践。目前,定义的可见性仅限于它所定义的.sbt文件。此时,它们在consoleProjectset命令中也不可见。在项目中使用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