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

时间:2014-06-11 23:52:53

标签: scala sbt

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

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

请告知。

2 个答案:

答案 0 :(得分:14)

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

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

来源:https://groups.google.com/forum/#!topic/play-framework/4DMWSTNM4kQ


build.sbt中,它看起来像这样:

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)

答案 1 :(得分:6)

@LimbSoup answer很好,但需要考虑一些改进。

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

由于它是关于删除文件,因此clean任务依赖于def doClean(clean: Seq[File], preserve: Seq[File]): Unit方法(来自sbt.Defaults)并且通过适当的更改也可以提供一些帮助。我认为这需要一个新的配置。

有关自定义clean任务的一些指导,请参阅How to exclude files in a custom clean task?