【问题标题】:How to conditionally execute SBT task如何有条件地执行 SBT 任务
【发布时间】:2015-03-25 17:53:20
【问题描述】:

我有另一种方法来完成现有的昂贵任务,但直到运行时我才知道我是否会这样做。 (例如,文件缓存。)

我该怎么做?


例如,packageBin:

packageBin in Compile := Def.taskDyn {
  if (canDoItMyWay) {
    doItMyWayTask
  } else {
    Defaults.packageTask
  }
}.value

如果执行后一个路径,这不起作用:

$ sbt packageBin
[trace] Stack trace suppressed: run last compile:packageBin for the full output.
[error] (util-2_10/compile:packageBin) sbt.Init$RuntimeUndefined: References to undefined settings at runtime.

【问题讨论】:

    标签: sbt sbt-0.13


    【解决方案1】:

    以下对我有用:

    val canDoItMyWay: Boolean = ...
    
    //regular method. Not a task
    def doItMyWay: File = ...
    
    packageBin in Compile := {
        if(canDoItMyWay) doItMyWay
        else (packageBin in Compile).value
    }
    

    这里不需要使用动态任务。 请注意,.value 仅适用于 sbt 0.13+

    另外,请注意,我没有为此使用特殊的 Task。只是常规代码。从名称来看:doItMyWayTask 表示您定义了一个任务。如果您使用自定义任务,则:

    • 需要吗?为什么是任务?是否取决于其他设置/任务?
    • 如果它必须是一个任务,请确保这里没有循环依赖,即它不应该依赖于packageBin

    【讨论】:

    • 但是在编译任务中不总是执行原来的 packageBin 吗?我的想法是在某些情况下避免它。
    • 没有。仅当条件不成立时。
    • @PaulDraper 我编辑了我的答案。这对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    相关资源
    最近更新 更多