【问题标题】:Wrapping an existing task with custom tasks使用自定义任务包装现有任务
【发布时间】:2016-08-02 13:40:07
【问题描述】:

假设我有两个任务,doStartdoStop,我想在这些任务中包装一个现有任务(例如 test)。以下方法不起作用:

test := Def.sequential(doStart, test, doStop).value

它在运行时失败,并出现关于未解析设置键的错误。我觉得这其实很自然,因为Def.sequential展开成Def.taskDyn的嵌套序列,而且由于中间任务中引用了test任务,所以请求了它的“新”值,但此时它是显然不可用:

test := Def.taskDyn {
  doStart.value
  Def.taskDyn {
    test.value
    doStop
  }
}.value

如果我引入一个临时任务并包装它而不是test

val _testOriginal = taskKey[Unit]("Used for wrapping.")

_testOriginal := test.value

test := Def.sequential(doStart, _testOriginal, doStop)

然后我没有得到错误,但我得到了一个看起来像无限循环的东西,因为随后执行了 doStart,但 SBT 无限期挂起而不调用原始的 test 任务。这似乎也很自然,因为_testOriginal 取决于test 的当前值,而不是原始值。

我现在看到的唯一“解决方案”是引入我自己的任务,例如 testWrappedtestQuickWrapped 等,并告诉我构建的用户使用它们而不是 test/testQuick/etc .,但我真的不想这样做。那么,如何包装现有任务?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:
    test := doStop.dependsOn(test.dependsOn(doStart)).value
    

    虽然仅供参考,但在测试的情况下,您可以使 doStartdoStop 不是任务,而是普通函数,并使用提供的 testOptions 工具。

    testOptions in Test += Tests.Setup(() => ...)
    
    testOptions in Test += Tests.Cleanup(() => ... )
    

    【讨论】:

    • 确实,dependsOn 技巧确实有效,谢谢!是否可以对作为输入任务的testQuick/testOnly 做同样的事情?
    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 2023-03-26
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    相关资源
    最近更新 更多