2012-05-16 22 views
3

我觀察到SBT每次發出「編譯」任務時都會編譯所有源文件,而不考慮自上次編譯以來的時間戳。以下是我的build.sbt文件:SBT編譯源文件,不管時間戳

name := "HelloSbt" 

scalaVersion := "2.8.2" 

unmanagedSourceDirectories in Compile := List(file("src")) 

以下是我的項目結構(忽略項目和目標目錄):

./src 
./src/Hello1.scala 
./src/a 
./src/a/Hello2.scala 
./build.sbt 

兩個源文件進行測試的目的只是空的對象定義。

當我鍵入「SBT編譯」,我得到了以下信息:

[info] Compiling 2 Scala sources to... 

,我可以找到目標目錄中新編譯的類文件。

沒有修改任何源文件,一分鐘後再次輸入「sbt compile」我得到了相同的信息和類文件,除了類文件的時間戳是最新的。我期待第二次編譯不會找到任何修改的源文件,並且不應該發生編譯。

我在Windows 7和Debian都做過測試。在測試期間,我沒有打開任何編輯器。有人可以提供一些關於如何設置自定義的src目錄的提示,但仍然只能編譯自上次構建以來修改的文件?

感謝

+1

不是在答案中,但我會打開一個問題。我認爲至少有一個警告是必要的。 –

回答

1

那是因爲你使用的是相對路徑,就好像它是一個絕對路徑。我很驚訝,它甚至產生了一個結果,但無論如何,你應該這樣寫:

unmanagedSourceDirectories in Compile <<= baseDirectory(base => List(base/"src")) 
+0

謝謝丹尼爾。順便說一句,我在哪裏可以找到這樣的信息?原來的問題似乎是一個微不足道的和公平的要求,但我無法做到。我在學習SBT方面花了很多時間(至少比我預期的要多),但是根據我的需要感覺很難彎曲SBT。 – Codism

+0

嗨丹尼爾,你能否證實我的觀察:在測試修改後的文件編譯時,我使用「touch」來更新文件時間戳。但似乎更新的時間戳不足以觸發重新編譯。我需要使源文件不同才能觸發重新編譯。這一切都沒問題,但對於構​​建工具來說似乎過度殺戮,因爲這意味着SBT必須爲每個源文件至少存儲一些指紋,而時間戳應該在大多數時間都可以使用。它背後的設計決定是什麼? (我只是感興趣。) – Codism

+0

@Codism你可能會把這兩個意見都變成問題 - 在第一個案例中提到你以前的兩個問題和具體問題,以避免使問題過於開放。答案不適合評論,此外,它可能對其他人有用。這可能會得到比我能給出的更好的答案。 –