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