FSC neu kompiliert jedes Mal,
-
25-09-2019 - |
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?
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.