【问题标题】:How do I make sbt run a task only once even though it is indirectly specified multiple times on the cli?即使在 cli 上间接指定了多次,如何让 sbt 只运行一次任务?
【发布时间】:2019-08-13 15:55:17
【问题描述】:

这是我的插件代码。它定义了一个从 CLI 触发的主任务lint,如下所示:sbt api/lint jobs/lint。它调用了一些特定于项目的 linter 和一些构建范围的 linter。构建范围的 linter 运行 scalafix,但如果我从 CLI 多次调用 lint,如上所述(对于多个项目),那么 scalafix 会运行多次。

对于给定的sbt 调用,如何使 scalafix(和 scalafixLinter)只运行一次?我以为 sbt 会缓存任务结果,但它似乎在这里不起作用。

object LinterPlugin extends AutoPlugin {

  object autoImport {
    lazy val scalafixLinter = taskKey[Unit]("Run scalafix on all scala code")
    lazy val lint = taskKey[Unit]("Run all linters")
  }

  override val buildSettings = Seq(
    scalafixLinter := {
      Def.taskDyn {
        if (...) {
          Def.task {
            // run scalafix
            (Compile / scalafix).toTask("").value
            (Test / scalafix).toTask("").value
          }
        } else {
          Def.task {}
        }
      }.all(ScopeFilter(inAnyProject)).value // run on all projects
    }
  )

  override val projectSettings = Seq(
    lint := {
      // run all the linters
      otherLinters.value
      scalafixLinter.value
    }
  )
}

【问题讨论】:

    标签: scala plugins sbt


    【解决方案1】:

    您可以使用 FileFunction.cache 方法。虽然这只适用于文件。

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 2022-10-06
      • 2017-05-24
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2014-08-08
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多