2011-07-08 113 views
10

我試圖設置SBT來編譯一個不使用maven目錄結構的現有項目。我現在用的是full configuration並且已經設置了我的JavaSource & resourceDirectory設置如下:在SBT中篩選資源

def settings = Defaults.defaultSettings ++ Seq(
    resourceDirectory in Compile <<= baseDirectory(_/"java"), 
    javaSource in Compile <<= baseDirectory(_/"java") 
) 

現在我希望能夠過濾我們包括在罐子神器的資源,因爲我們目前有螞蟻做,再加上排除。 java文件作爲我們的資源與源代碼混合在一起。例如:

<fileset dir="java" includes="**/*.txt, **/*.csv" excludes="**/*.java" /> 

有沒有辦法做到這一點?

+0

只是通知人們看這個問題,這是SBT 0.10。 –

+0

值得創建一個sbt10標籤嗎?它與sbt07非常不同... – opyate

+1

一個子通知 - 'defaultExcludes'已棄用,用於'excludeFilter' in sbt 0.11 – wbarksdale

回答

6

使用defaultExcludes範圍爲unmanagedResources任務和可選的配置。例如,該設置從主資源不包括.java文件:

defaultExcludes in Compile in unmanagedResources := "*.java" 

in Compile限制此設置只適用於主要資源。通過使用in Test來代替它,它僅適用於測試資源。通過省略配置(即,不是in Compilein Test),該設置將應用於主資源和測試資源。

in unmanagedResources僅將這些排除應用於資源。例如,要將排除應用於來源,範圍將爲in unmanagedSources。非託管部分的原因是強調這些僅適用於非託管(或手動編輯)的源。

defaultExcludes鍵的類型爲sbt.FileFilter,所以設置值必須是這種類型。在上面的示例中,"*.java"隱式轉換爲FileFilter。 *被解釋爲通配符,因此過濾器接受名稱以'.java'結尾的文件。要合併篩選器,請使用||&&。例如,如果需要的話.scala文件被排除,以及,所述參數:=將是:

"*.java" || "*.scala" 

在原來的螞蟻文件集,包含和排除的過濾器選擇互斥文件集,所以只有一個是必要。

也可以直接爲unmanagedResources構建Seq[File]。例如:

unmanagedResources in Compile <<= 
    unmanagedResourceDirectories in Compile map { (dirs: Seq[File]) => 
    (dirs ** ("*.txt" || "*.csv" -- "*.java")).get 
    } 

**方法選擇匹配FileFilter論點,即所有後代。您可以通過運行show unmanaged-resources來驗證是否按照預期選擇了這些文件。

+0

如果我想排除.java文件,我可以只包含一個特定的文件集嗎?如果可能的話,我推測否定一個'sbt.FileFilter'會起作用。 –

+0

沒有互補的'includes'設置或任何東西。源代碼有'sourceFilter',類路徑有'classpathFilter',但沒有資源。把它們統一在'include in unmanagedResources'之類的東西下會很有用,所以你可能會[打開一個bug](https://github.com/harrah/xsbt/issues)。否定'FileFilter'是可能的,但在這裏沒有幫助。 –

+0

我編輯了答案,包括如何直接構建資源設置。 –