FSC每次都重新编译

Jer*_*iho 3 scala compilation scalac

FSC每次都重新编译我的.scala文件,即使没有必要 - 我可以编译它两次而不需要在两次尝试之间编辑任何内容并重新编译它们!例如,我有2个文件

Hello.scala

class Hello{
  print("hello")
}
Run Code Online (Sandbox Code Playgroud)

和Tokens.scala:

abstract class Token(val str: String, val start: Int, val end: Int)
  {override def toString = getClass.getSimpleName + "(" + "[" + start + "-" + end + "]" + str + ")"}
class InputToken(str: String, start: Int, end: Int)
        extends Token(str, start, end)
 class ParsedToken(str: String, start: Int, end: Int, val invisible: Boolean)
        extends Token(str, start, end)
Run Code Online (Sandbox Code Playgroud)

当我要求ant从头编译项目时,我看到以下输出:

ant compile
init:
    [mkdir] Created dir: D:\projects\Test\build\classes
    [mkdir] Created dir: D:\projects\Test\build\test\classes

compile:
      [fsc] Base directory is `D:\projects\Test`
      [fsc] Compiling source files: somepackage\Hello.scala, somepackage\Tokens.scala to D:\projects\Test\build\classes

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

比我不编辑任何东西并再次询问ant编译:

ant compile
init:
    [mkdir] Created dir: D:\projects\Test\build\classes
    [mkdir] Created dir: D:\projects\Test\build\test\classes

compile:
      [fsc] Base directory is `D:\projects\Test`
      [fsc] Compiling source files: somepackage\Tokens.scala to D:\projects\Test\build\classes

BUILD SUCCESSFUL
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,fsc在Hello.scala(无重新编译)的情况下表现得很聪明,在Tokens.scala的情况下表现为哑.我建议问题以某种方式与继承有关,但这就是全部.

那有什么不对?

Geo*_*edy 5

Tokens.scala被重新编译,因为没有与其基本名称匹配的类文件.也就是说,它不会生成Tokens.class文件.在确定是否应该编译源文件时,fsc会查找具有相同基本名称的类文件,如果类文件不存在或者源文件的修改时间晚于类文件的修改时间,则将重建源文件.如果可以,我建议你研究一下Simple Build Tool,它的连续编译模式准确地跟踪source-> classfile映射,不会重新编译Tokens.scala

对于额外的笑声,请考虑如果您有一个不同的源文件,编译器可能会做class Tokens什么.

尽管scala允许任何源文件中的任意公共类/对象,但仍有相当多的工具假设您将遵循java约定并且至少在文件中具有与源文件基本名称相同的一个类/对象.