Frage

FSC rekompiliert meine .scala Dateien jedes Mal, auch gibt es keine Notwendigkeit - ich kann es zweimal kompilieren, ohne zwischen den Versuchen, die Bearbeitung etwas und es neu kompiliert sie! Zum Beispiel habe ich 2 Dateien

Hello.scala

class Hello{
  print("hello")
}

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

Als ich ant fragen Projekt von Grund auf neu zu kompilieren Ich sehe folgende Ausgabe:

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

als ich nicht bearbeiten etwas und fragen ant Kompilierung wieder:

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

Wie Sie sehen können, fsc wirkt bei Hello.scala (keine Neuübersetzung) smart und wirkt bei Tokens.scala stumm. Ich schlage vor, dass das Problem irgendwie mit Vererbung verwendet ist, aber das ist alles.

Also, was ist falsch?

War es hilfreich?

Lösung

Ich weiß nicht, wie viel Posting Sachen von anderen geschrieben, aber ich denke, diese Frage verdient eine vollständigere Antwort, was genau gefragt wurde.

Also, zunächst einmal neu kompiliert fsc alles standardmäßig Zeitraum. Es ist ant, nicht fsc, die Hello.scala aus verläßt, weil der Dateiname die Klassennamen übereinstimmt. Es ist nicht Tokens.scala heraus verlassen, weil es keine Klasse Tokens zusammengestellt genannt -. So, in Ermangelung eines Tokens.class, es neu kompiliert Tokens.scala

Das ist die falsche Sache mit Scala zu tun. Scala unterscheidet sich in einem grundlegenden Aspekt von Java, dass aufgrund der technischen Beschränkungen auf JVM, eine Änderung in einem trait erfordert Neuübersetzung von jeder Klasse, ein Objekt oder Instanziierung dass Verwendungen es.

Nun kann man die ant Aufgabe fix eine intelligentere Sache beginnend mit Scala 2.8 zu tun. Ich nehme diese Informationen von blogtrader.net von Caoyuan, von Scala für Netbeans Ruhm Plugin. Sie definieren die Scala Aufgabe auf dem Build-Ziel wie folgt:

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

Es sagt ant neu kompilieren alles, wie ant einfach nicht intelligent genug ist, um herauszufinden, was neu kompiliert oder nicht benötigt werden. Es sagt auch Scala eine Datei mit Kompilierungsabhängigkeiten zu bauen, und eine transitive Abhängigkeit Algorithmus verwenden, um herauszufinden, was neu kompiliert werden muss oder nicht.

Sie müssen auch das init Ziel ändern, um das Build-Verzeichnis in dem Build-Classpath enthalten, wie Scala wird, dass müssen andere Klassen neu zu kompilieren. Es soll wie folgt aussehen:

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

Weitere Informationen finden Sie in Caoyuan Blog.

Andere Tipps

Tokens.scala ist neu übersetzt, weil es keine Klassendatei ist seine Basisnamen übereinstimmen. Das heißt, dass es keine Tokens.class Datei erzeugen. Bei der Entscheidung, ob eine Quelldatei kompiliert werden soll, fsc sucht nach einer Klassendatei mit dem gleichen Basisnamen und wenn die Klassendatei Datei nicht existiert oder der Zeitpunkt der letzten Änderung an der Quelle ist später als die der Klassendatei, wird die Quelldatei neu erstellt werden . Wenn Sie können, schlage ich vor, dass Sie Einfache Build-Tool , seine kontinuierliche Kompiliermodusfunktion genau verfolgt Quellen-> Klassendatei-Mapping und wird nicht neu kompilieren Tokens.scala

Für zusätzliche lacht, darüber nachzudenken, was der Compiler tun könnte, wenn Sie eine andere Quelldatei haben, die class Tokens in sich hat.

Obwohl scala beliebige öffentliche Klassen erlaubt / Objekte in jeder Quelldatei, gibt es noch einiges an Werkzeugen, die Sie die Java-Konvention folgen etwas annimmt, und zumindest eine Klasse / Objekt in der Datei mit dem gleichen Namen wie die Quelle Datei Basisnamen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top