即使在 cli 上间接指定了多次,如何让 sbt 只运行一次任务?

Posted

技术标签:

【中文标题】即使在 cli 上间接指定了多次,如何让 sbt 只运行一次任务?【英文标题】:How do I make sbt run a task only once even though it is indirectly specified multiple times on the cli? 【发布时间】: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
    
  )

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于即使在 cli 上间接指定了多次,如何让 sbt 只运行一次任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决具有不同包装常春藤类型的sbt中的依赖关系?

如何让 sbt 使用本地 Maven 代理存储库(Nexus)?

如何让sbt在子项目specs2运行中使用正确的类加载器?

如何让 SBT 跳过给定子项目的交叉编译?

使 SBT 子项目任务依赖于另一个子项目任务

如何设置 sbt 以便在联机时获取所有必要的依赖项,然后让我脱机工作?