Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sbt 如何在不使用聚合的情况下执行对子项目调用clean的任务?_Sbt - Fatal编程技术网

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

Sbt 如何在不使用聚合的情况下执行对子项目调用clean的任务?,sbt,Sbt,我想做一个takecleanAll,在许多子项目上执行clean任务。我不想仅仅为了清洁而使用聚合 我们在使用子模块时遇到了play的资产路由问题 如何创建一个新任务已经有了很好的文档,但是如何调用子项目上的任务呢?使用以下build.sbt: val selectDeps = ScopeFilter(inDependencies(ThisProject)) clean in Compile := clean.all(selectDeps).value 它假定build.sbt文件位于对其自

我想做一个take
cleanAll
,在许多子项目上执行
clean
任务。我不想仅仅为了清洁而使用聚合

我们在使用子模块时遇到了play的资产路由问题


如何创建一个新任务已经有了很好的文档,但是如何调用子项目上的任务呢?

使用以下
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: _*)

基于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)

它可以通过调用在SBT中执行:
cleanAll

您在根上调用clean,它在子项目上调用clean。不,只有在聚合时才执行,这是我想要避免的。从根上运行
cleanFiles
,或者
find-name target | xargs rm-Rf
cleanFiles仅列出lib|u管理的目录和target目录,但并不真正清理任何内容。我想清理一组特定的子项目,而不是我们在某些目录结构中可以找到的所有目标目录。不安全,如果某人的源代码管理中有一个目标目录或文件,该怎么办?这是如何从Build.scala文件中实现的?你能告诉gist.github.com构建定义(scala+sbt)并共享链接以便我查看和帮助吗?谢谢。