为什么sbt.Extracted在追加方法时删除先前定义的TaskKey?

时间:2015-03-25 09:22:05

标签: scala sbt

在sbt.Exctracted中有一个合适的方法可以将TaskKey添加到当前状态。假设我有inState: State

val key1 = TaskKey[String]("key1")
Project.extract(inState).append(Seq(key1 := "key1 value"), inState)

当我两次做这件事时,我已经面临着奇怪的行为。我在以下示例中得到了例外:

val key1 = TaskKey[String]("key1")
val key2 = TaskKey[String]("key2")
val st1: State = Project.extract(inState).append(Seq(key1 := "key1 value"), inState)
val st2: State = Project.extract(st1).append(Seq(key2 := "key2 value"), st1)
Project.extract(st2).runTask(key1, st2)

导致:

java.lang.RuntimeException: */*:key1 is undefined.

问题是 - 为什么它会像这样工作?是否可以通过多次调用TaskKey来执行特定任务时添加多个sbt.Extracted.append

示例sbt项目为sbt.Extracted append-example,重现问题只需运行sbt fooCmd

1 个答案:

答案 0 :(得分:3)

Josh Suereth answer发布到sbt-dev邮件列表。引用:

  

append函数非常脏/低级。这可能是其实现中的一个错误(或缺少文档),但它在使用时会消除任何其他附加设置。

     

你想做什么,(我认为)会附加到当前的“会话”中,所以事情就会存在,用户可以通过“sesison clear”命令删除你所做的事情。

     

另外,您传递的设置是“原始”或“完全限定”形式。如果您要编写的设置与build.sbt文件中的设置完全相同,则需要先对其进行转换,以使Scopes与当前项目匹配等。

     

我们在sbt-server中提供了一个实用程序,可以更轻松地将设置添加到当前会话中:

     

https://github.com/sbt/sbt-remote-control/blob/master/server/src/main/scala/sbt/server/SettingUtil.scala#L11-L29

我已经测试了所提出的解决方案,它就像一个魅力。