Как заставить sbt запускать задачу только один раз, даже если она косвенно указана несколько раз в клиенте? - PullRequest
0 голосов
/ 22 марта 2019

Вот мой код плагина.Он определяет основную задачу lint, которая запускается из интерфейса командной строки следующим образом: sbt api/lint jobs/lint.Он вызывает некоторые специфичные для проекта линтеры и некоторые линтеры всей сборки.Линтер во всей сборке запускает scalafix, но если я вызываю lint несколько раз из CLI, как указано выше (для нескольких проектов), то scalafix запускается несколько раз.

Как сделать scalafix (и scalafixLinter) запускать только один раз для данного sbt вызова?Я думал, что 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
    }
  )
}
...