如何在不使用聚合的情况下执行在子项目上调用clean的任务?

时间:2014-10-07 20:36:01

标签: sbt

我想在一些子项目上执行cleanAll任务clean。我不想仅仅为了clean而使用聚合。

当我们使用子模块时,我们遇到了play的资产路径问题。

如何创建新任务,但如何在子项目上调用任务?

2 个答案:

答案 0 :(得分:3)

根据Jacek Laskowski的例子,我提出了以下插件,该插件应放在/project文件夹中:

import sbt._
import sbt.AutoPlugin
import sbt.Keys._
import sbt.plugins.JvmPlugin

object CleanAllPlugin extends AutoPlugin {

  val cleanAll = taskKey[Unit]("Cleans all projects in a build, regardless of dependencies")

  override def requires = JvmPlugin

  override def projectSettings = Seq(
    cleanAllTask
  )

  def cleanAllTask = cleanAll := Def.taskDyn {
    val allProjects = ScopeFilter(inAnyProject)
    clean.all(allProjects)
  }.value
}

现在可以将插件添加到根项目中以供使用:

val main = Project("root", file("."))
  .enablePlugins(CleanAllPlugin)

可以通过调用cleanAll

在SBT中执行

答案 1 :(得分:1)

使用以下build.sbt

val selectDeps = ScopeFilter(inDependencies(ThisProject))

clean in Compile := clean.all(selectDeps).value

它假定build.sbt文件位于项目中,clean已在自身和dependsOn项目上执行。

如果您需要project/Build.scala,请添加以下内容:

val selectDeps = ScopeFilter(inDependencies(ThisProject))
val cleanInSubprojects = Seq(
  clean in Compile := clean.all(selectDeps).value
)

并将cleanInSubprojects添加到每个项目的设置中:

// definition of a project goes here
  .settings(cleanInSubprojects: _*)