我想出了這個解決方案,它定義了依賴於以前的編譯任務新的編譯任務(從而有效地讓我的右鉤源編譯後,它的包裝前)
def mySettings = {
// add functionality to the standard compile task
inConfig(Compile)(Seq(compile in Compile <<= (target,streams,compile in Compile) map{
(targetDirectory, taskStream, analysis) =>
import taskStream.log
// this runs after compile but before package-bin
recursiveListFiles(targetDirectory, ".*javax.*".r) foreach {
file =>
log.warn("deleting matched resource: " + file.getAbsolutePath())
IO.delete(file)
}
analysis
})) ++
Seq(name := "MyProject", version := "1.0", exportJars := true)
}
def recursiveListFiles(f: File, r: Regex): Array[File] = {
val these = f.listFiles
val good = these.filter(f => r.findFirstIn(f.getName).isDefined)
good ++ these.filter(_.isDirectory).flatMap(recursiveListFiles(_, r))
}
它比我希望的複雜一點,但它允許我在打包之前進行各種修改(在這種情況下,搜索目標文件夾刪除與正則表達式匹配的所有類文件)。此外,它還實現了堅持默認SBT生命週期的第二個目標。
這是一個比我自己的更好的解決方案,也是一個很好的答案,因爲它還設法澄清了一些核心SBT概念。 –
請注意,〜=沒有記錄在0.13頁面上,解釋存在於0.12文檔中http://www.scala-sbt.org/0.12.4/docs/Getting-Started/More-About-Settings.html –
語法爲0.13 (編譯,packageBin):= { (映射到(Compile,packageBin))。value.filter {case(file,toPath)=> toPath!=「javax/servlet/Servlet.class 「 } }''' –