Scala FSC每次都会重新编译
FSC每次都会重新编译我的.scala文件,即使没有必要-我可以编译两次,而不需要在尝试之间编辑任何内容,然后它会重新编译它们! 例如,我有两个文件 你好,斯卡拉Scala FSC每次都会重新编译,scala,compilation,scalac,Scala,Compilation,Scalac,FSC每次都会重新编译我的.scala文件,即使没有必要-我可以编译两次,而不需要在尝试之间编辑任何内容,然后它会重新编译它们! 例如,我有两个文件 你好,斯卡拉 class Hello{ print("hello") } 和Tokens.scala: abstract class Token(val str: String, val start: Int, val end: Int) {override def toString = getClass.getSimpleName +
class Hello{
print("hello")
}
和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)
当我要求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
然后我不编辑任何内容并再次要求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
如您所见,fsc在Hello.scala(无需重新编译)的情况下表现得很聪明,而在Tokens.scala的情况下表现得很愚蠢。我认为这个问题在某种程度上与继承有关,但仅此而已
有什么问题吗?Tokens.scala被重新编译,因为没有与其基名称匹配的类文件。也就是说,它不会生成Tokens.class文件。在决定是否应编译源文件时,fsc会查找具有相同基名称的类文件,如果该类文件不存在或对源文件的修改时间晚于该类文件的修改时间,则将重建源文件。如果可以的话,我建议您仔细研究一下,它的连续编译模式准确地跟踪source->classfile映射,并且不会重新编译Tokens.scala 如果您有一个不同的源文件,其中包含
类标记
,那么编译器可能会做些什么呢
尽管scala允许在任何源文件中使用任意公共类/对象,但仍有相当多的工具假定您在某种程度上遵循java约定,并且文件中至少有一个类/对象与源文件basename同名。我不喜欢其他人写的帖子,但我认为这个问题应该有一个比严格要求更完整的答案 因此,首先,
fsc
默认情况下重新编译所有内容,句号。它是ant
,而不是fsc
,它将Hello.scala
退出,因为文件名与类名匹配。它没有将Tokens.scala
保留在外,因为没有编译名为Tokens
的类——因此,在缺少Tokens.class
的情况下,它重新编译Tokens.scala
这对Scala来说是错误的。Scala与Java在一个基本方面的不同之处在于,由于JVM的技术限制,trait
中的更改需要重新编译使用它的每个类、对象或实例化
现在,我们可以修复ant
任务,从Scala 2.8开始做一件更聪明的事情。我从曹元那里得到了这些信息,曹元是Netbeans的Scala插件的一员。您可以在构建目标上定义Scala任务,如下所示:
<scalac srcdir="${src.dir}"
destdir="${build.classes.dir}"
classpathref="build.classpath"
force="yes"
addparams="-make:transitive -dependencyfile ${build.dir}/.scala_dependencies"
>
<src path="${basedir}/src1"/>
<!--include name="compile/**/*.scala"/-->
<!--exclude name="forget/**/*.scala"/-->
</scalac>
有关更多详细信息,请参阅草园的博客。FSC将编译所有内容,除非您通过标志告知它进行传递依赖性分析。您是如何在Ant中配置Scala编译任务的?啊哈,这是1秒内的“宾果”,但我错过了太多时间来准确地编写答案,所以您是第一个)而且当您密封类时,java约定是不合适的。
<path id="build.classpath">
<pathelement location="${scala-library.jar}"/>
<pathelement location="${scala-compiler.jar}"/>
<pathelement location="${build.classes.dir}"/>
</path>