在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
答案 0 :(得分:3)
Josh Suereth 将answer发布到sbt-dev邮件列表。引用:
append
函数非常脏/低级。这可能是其实现中的一个错误(或缺少文档),但它在使用时会消除任何其他附加设置。你想做什么,(我认为)会附加到当前的“会话”中,所以事情就会存在,用户可以通过“sesison clear”命令删除你所做的事情。
另外,您传递的设置是“原始”或“完全限定”形式。如果您要编写的设置与build.sbt文件中的设置完全相同,则需要先对其进行转换,以使Scopes与当前项目匹配等。
我们在sbt-server中提供了一个实用程序,可以更轻松地将设置添加到当前会话中:
我已经测试了所提出的解决方案,它就像一个魅力。