【问题标题】:Triggered Execution in SBT 0.13.xSBT 0.13.x 中的触发执行
【发布时间】:2020-01-02 20:56:34
【问题描述】:

我正在使用 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 使 &lt;&lt;= 过时,:= 应该足够了。

【问题讨论】:

  • 我相信这是一个合法的错误。除非使用

标签: sbt


【解决方案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 上的匿名任务。

请注意,&lt;&lt;= 是提取位置信息的set 的荣耀版本。而set 只是Def.setting(key, value, position) 的别名,它又创建了一个新的Setting 实例。请注意,内部创建的设置实例具有这 3 个参数的构造函数。

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

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

从理论上讲,您可以解决创建设置,并将正确的触发器绑定到某个任意键。我不确定这将如何工作。

【讨论】:

  • 我认为这是一个错误(不确定现在是否已修复)。 jsureth 在对原始问题的评论中提到了这一点。该问题不是解决方法,因为其中一个示例有效。我只是好奇那个没有。
【解决方案2】:

我知道问题集中在 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 应该同时打印“Task 1”和“Task 2”。当然你也可以triggeredBy compile.In(Compile) 而不是自定义的taskKey 比如“task1”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2013-10-30
    • 2014-02-03
    • 2014-06-04
    • 2013-09-03
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多