Scala 如何在编译任务之前执行shell命令?
每当我的sbt项目构建时,我想执行一个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
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:={…}
从sbt1.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)