Scala SBT编译源文件而不考虑时间戳

Scala SBT编译源文件而不考虑时间戳,scala,sbt,Scala,Sbt,我观察到,每当我执行“编译”任务时,SBT都会编译所有源文件,而不管上次编译后的时间戳如何。以下是我的build.sbt文件: name := "HelloSbt" scalaVersion := "2.8.2" unmanagedSourceDirectories in Compile := List(file("src")) 以下是我的项目结构(忽略的项目和目标目录): 出于测试目的,这两个源文件只是空的对象定义 当我输入“sbt编译”时,我得到了以下信息: [info] Compil

我观察到,每当我执行“编译”任务时,SBT都会编译所有源文件,而不管上次编译后的时间戳如何。以下是我的build.sbt文件:

name := "HelloSbt"

scalaVersion := "2.8.2"

unmanagedSourceDirectories in Compile := List(file("src"))
以下是我的项目结构(忽略的项目和目标目录):

出于测试目的,这两个源文件只是空的对象定义

当我输入“sbt编译”时,我得到了以下信息:

[info] Compiling 2 Scala sources to...
我可以在目标目录中找到新编译的类文件

没有修改任何源文件,一分钟后,再次键入“sbt compile”,我得到了相同的信息和类文件,只是类文件的时间戳是最新的。我希望第二次编译不会找到任何修改过的源文件,也不会进行编译

我在Windows7和Debian中都做了测试。在测试期间,我没有打开任何编辑器。有人能给出一些关于如何设置自定义src目录的提示,同时仍然能够编译自上次构建以来修改过的文件吗


谢谢

这是因为您使用的是相对路径,就好像它是绝对路径一样。我很惊讶它甚至会产生一个结果,但无论如何,你应该这样写:

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

Compile中的unmanagedSourceDirectories不在答案中,但我会就此提出一个问题。我想至少有必要发出警告。谢谢丹尼尔。顺便问一下,我在哪里可以找到这样的信息?最初的问题似乎是一个琐碎而公平的要求,但我就是做不好。我花了很多时间(至少比我预期的多)学习SBT,但觉得很难根据我的需要调整SBT。嗨,丹尼尔,你能证实我的观察吗:在测试修改后的文件编译时,我使用了“触摸”来更新文件时间戳。但更新的时间戳似乎不足以触发重新编译。我需要使源文件不同以触发重新编译。这一切都没问题,但对于构建工具来说似乎太费劲了,因为这意味着SBT必须为每个源文件存储至少一些指纹,而时间戳应该在大部分时间都有效。它背后的设计决定是什么?(我只是感兴趣。)@Codism你可以把这两个评论都变成问题——提及你之前的两个问题和第一个案例中的具体问题,以避免问题过于开放。答案不适合评论,而且,它可能对其他人有用。它可能会得到比我能给出的更好的答案。@Codism您的问题帮助我开始SBT,谢谢!!在文件内容校验和方面,SCons也做了同样的事情,他们的想法是(除其他外)时间戳在某些网络场景中可能不那么有效。SCons可以选择使用时间戳和/或内容。@akauppi:听起来这是一个合理的理由。谢谢你的更新。
unmanagedSourceDirectories in Compile <<= baseDirectory(base => List(base / "src"))