为什么sbt.Extracted移除了以前定义的TaskKey while append方法



sbt中有一个合适的方法。已执行将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.

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

sbt项目的示例是sbt。提取的附加示例,只需运行sbt fooCmd

即可再现问题

Josh Suereth将答案发布到sbt dev邮件列表中。报价:

append函数相当脏/级别很低。这可能是其实现中的一个错误(或者缺乏文档),但它在使用时会破坏任何其他附加设置。

你想做的(我认为)是附加到当前的";会话";所以事情会一直存在,用户可以通过";sesison clear";命令

另外,你正在通过的设置是";生的";或";完全合格";如果你想让你写的设置和build.sbt文件中的设置完全一样,你需要先对它进行转换,这样Scopes就可以匹配当前项目,等等。

我们在sbt服务器中提供了一个实用程序,可以更容易地将设置附加到当前会话中:

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

我已经测试了提议的解决方案,这很有魅力。

最新更新