Scala 如何在编译任务之前执行shell命令?

Scala 如何在编译任务之前执行shell命令?,scala,sbt,Scala,Sbt,每当我的sbt项目构建时,我想执行一个shell命令--rm-ra目录。这将在编译之前进行 推理:存在一个永远不会更新的缓存文件。如果我在每次编译之前删除它,它会强制更新 请告知。您可以创建删除文件的任务: val removeCacheTask = TaskKey[Unit]("removeCacheFile", "Deletes a cache file") val removeCacheSettings = removeCacheTask := { import sys.proce

每当我的sbt项目构建时,我想执行一个shell命令--
rm-r
a目录。这将在
编译之前进行

推理:存在一个永远不会更新的缓存文件。如果我在每次编译之前删除它,它会强制更新


请告知。

您可以创建删除文件的任务:

val removeCacheTask = TaskKey[Unit]("removeCacheFile", "Deletes a cache file")
val removeCacheSettings = removeCacheTask := {
    import sys.process._
    Seq("rm", "/path/to/file") !
}
然后,通过将以下设置添加到项目中,要求在编译之前运行任务:

Project(...).settings(
    removeCacheSettings,
    compile in Compile <<= (compile in Compile).dependsOn(removeCacheTask)
)

很好,但是有一些改进需要考虑。

执行
rm
的命令在其他非
rm
操作系统(如Windows)上可能不可用,因此使用
sbt.IO.delete
方法更安全

因为它是关于删除文件的,所以有一个
clean
任务依赖于
def doClean(clean:Seq[File],preserve:Seq[File]):Unit
方法(来自
sbt.Defaults
),如果进行适当的更改,它也会有所帮助。不过,我认为它需要一个新的配置


有关自定义
clean
任务的一些指导信息,请参阅。

我已经实现了上面的答案,效果非常好。我现在正在研究你们的扩张,所以我也为此感谢你们!对为了清晰起见,我对其进行了升级,并在验证功能后将其标记为已回答。正是我想要的,谢谢!请注意,如果要引用子项目中的任务,必须提供范围,否则将无法在子项目中找到该任务。最简单的编写方法是
removeCacheTask in Global:={…}
从sbt
1.1.1
开始,这种方法现在可以工作:
lazy val removeCacheTask = TaskKey[Unit]("removeCacheFile", "Deletes a cache file")

removeCacheTask := {
    import sys.process._
    Seq("rm", "/path/to/file")!
}

compile in Compile <<= (compile in Compile).dependsOn(removeCacheTask)