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

Chr*_*ler 12 scala sbt

我想rm -r在我的sbt项目构建时执行一个shell命令 - 一个目录.这将是以前compile.

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

请指教.

Mic*_*jac 14

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

val removeCacheTask = TaskKey[Unit]("removeCacheFile", "Deletes a cache file")
val removeCacheSettings = removeCacheTask := {
    import sys.process._
    Seq("rm", "/path/to/file") !
}
Run Code Online (Sandbox Code Playgroud)

然后要求在编译之前运行任务,方法是将这些设置添加到项目中:

Project(...).settings(
    removeCacheSettings,
    compile in Compile <<= (compile in Compile).dependsOn(removeCacheTask)
)
Run Code Online (Sandbox Code Playgroud)

资料来源:https://groups.google.com/forum/#!topic/play- frame/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)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果要引用子项目中的任务,则必须指定范围,否则将在子项目中找不到该任务。最简单的写法是`removeCacheTask in Global:= {...}` (2认同)

Jac*_*ski 6

@LimbSoup答案很好,但需要考虑一些改进.

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

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

请参见如何排除自定义清理任务中的文件?有关自定义clean任务的一些指导.