FSC重新编译每次我.scala文件甚至没有必要 - 我能两次编译它,而无需编辑尝试之间的任何东西,重新编译他们! 例如,我有2个文件

Hello.scala

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 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 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的情况下哑。我认为,这个问题以某种方式与遗传有关,但仅此而已。

那么,什么是错的?

有帮助吗?

解决方案

我不喜欢别人写的帖子很多东西,但我认为这个问题值得一个更完整的答案是什么严格要求。

因此,首先,fsc重新编译默认周期一切。这是ant,不fsc,这是离开Hello.scala出来,因为文件名匹配的类名。它是不会离开Tokens.scala出来,因为没有称为Tokens类编译 - 所以,在不存在Tokens.class的,它重新编译Tokens.scala

这是错误的做法与斯卡拉。阶的不同之处在于:从Java一个基本方面,因为对JVM技术的限制,在一个trait的变化要求每一个类,对象或实例的重新编译使用它。

现在,一个可以修复ant做任务开始使用Scala 2.8聪明的事情。我被草原考虑从 blogtrader.net 此信息,斯卡拉的插件用于Netbeans的名声。您可以定义在构建目标斯卡拉任务象下面这样:

<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>

它告诉ant重新编译一切,ant根本不是足够聪明,找出需要重新编译,或者不是。它还告诉的斯卡拉的建立包含编译依赖文件,并使用传递依赖算法来找出哪些需要重新编译或没有。

您还需要修改初始化对象包括在构建类路径生成目录,如斯卡拉将需要重新编译其他类。它应该是这样的:

<path id="build.classpath">
    <pathelement location="${scala-library.jar}"/>
    <pathelement location="${scala-compiler.jar}"/>
    <pathelement location="${build.classes.dir}"/>
</path>

有关详细信息,请参阅草原的博客。

其他提示

Tokens.scala被重新编译,因为没有一个类文件匹配其基本名。也就是说,它不会产生Tokens.class文件。当决定如果源文件应该被编译,FSC查找具有相同基类文件,如果类文件不存在,或对源文件的修改时间晚于类文件,源文件将被重建。如果可以的话,我建议你看看简单的构建工具,其连续编译模式准确地跟踪源 - >类文件映射,不会重新编译Tokens.scala

对于额外的笑,想想如果你有一个具有class Tokens在一个不同的源文件编译器可能会做的。

虽然斯卡拉允许任意的公开课/任意源文件中的对象,还是有相当多的模具,它假定你将有所遵循Java惯例,并至少有一个具有相同名称作为源文件中的一个类/对象文件名前缀。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top