SBT 0.13.x中的触发执行

时间:2014-05-03 14:21:34

标签: sbt

我正在使用SBT 0.13.2,我希望通过执行编译任务的方式触发我的任务。我知道我可以使用triggeredBy方法实现此目的,如taskDefinition.triggeredBy(compile in Compile)中所述。

我有build.sbt我的自定义任务定义。

问题在于我无法理解为什么以下工作符合预期

val triggeredTask = taskKey[Unit]("Triggered by compile")

triggeredTask <<= Def.task {
  println("TRIGGERED BY COMPILE")
}.triggeredBy(compile in Compile)

但是下一个不起作用(compile执行得很好,但我的任务没有被触发)

val triggeredTask = taskKey[Unit]("Triggered by compile")

triggeredTask := Def.task {
  println("TRIGGERED BY COMPILE")
}.triggeredBy(compile in Compile).value

我的理解是SBT 0.13使<<=过时了,:=就足够了。

2 个答案:

答案 0 :(得分:1)

我可能会误解你要做的事情。

如果我让你的例子更加冗长,那就像这样:

val triggeredTaskKey = taskKey[Unit]("Triggered by compile")

val anonymousTask = Def.task {
  println("TRIGGERED BY COMPILE")
}.triggeredBy(compile in Compile)

// I imagine the macro doing something like this
triggeredTaskKey <<= anonymousTask map (identity)

这也不会触发compile上的匿名任务。

请注意,<<=set的精美版本,用于提取位置信息。 set只是Def.setting(key, value, position)的别名,后者又创建了一个新的Setting实例。请注意,内部创建的设置实例具有这3个参数的构造函数。

我认为sbt中没有办法声明没有键的设置(我可能在这里错了)。但是,您似乎想要创建一个没有密钥的设置(触发)。

这可能是由错误引起的,我不确定sbt是否应该递归地遍历依赖项以查找triggeredBy中具有info密钥的任务。但目前却没有(如trigger method所示。

从理论上讲,你可以通过绑定到某个任意键的正确触发器来创建设置。我不确定这是怎么回事。

答案 1 :(得分:0)

我知道问题集中在SBT 0.13.x上,但是如果SBT 1.3.4 this example仍然存在困惑,并且可以很好地完成addressing the v0.x bug

lazy val task1 = taskKey[Unit]("task 1")
lazy val task2 = taskKey[Unit]("task 2")

task1 := println("Task 1")
task2 := println("Task 2")

task2 := (task2 triggeredBy task1).value

因此,键入task1应该同时打印“任务1”和“任务2”。当然,您可以triggeredBy compile.In(Compile)代替“ {task1”之类的自定义taskKey