質問
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
を再コンパイル
これはスカラを行うには間違ったことです。 Scalaは用途それます。
という理由JVM上の技術的な制限により、trait
の変化はすべてのクラス、オブジェクトまたはインスタンス化の再コンパイルが必要で、その中にJavaから1つの基本的な側面で異なります
さて、1はScalaの2.8で始まる賢くことを行うant
タスクを修正することができます。私は、ScalaはNetbeansの名声のためのプラグイン、Caoyuanにより blogtrader.netするからこの情報を取っています。あなたは、以下のようなビルドターゲット上の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>
ant
は、単に再コンパイルするか、しないかをする必要があるかを把握するためにスマート十分ではありませんように、これは、再コンパイルすべてにant
を伝えます。また告げるのスカラのコンパイルの依存関係を含むファイルを構築し、再コンパイルが必要かどうかを把握するために推移的依存関係のアルゴリズムを使用する。
また、Scalaは他のクラスを再コンパイルすることが必要になりますよう、ビルドクラスパスにビルドディレクトリを含めるように初期化ターゲットを変更する必要があります。それは次のようになります:
<path id="build.classpath">
<pathelement location="${scala-library.jar}"/>
<pathelement location="${scala-compiler.jar}"/>
<pathelement location="${build.classes.dir}"/>
</path>
詳細については、Caoyuanのブログを参照してください。
他のヒント
Tokens.scalaが再コンパイルされます。つまり、それはTokens.classファイルを生成しません。ソースファイルが同じベース名を持つクラスファイルのために、FSCルックスをコンパイルする必要があるとクラスファイルが存在しないか、ソースファイルの更新時刻がクラスファイルのそれよりも後であれば、ソースファイルが再構築される場合を決定するとき。あなたができるならば、私はあなたがシンプルなビルドツールに、その継続的に見えることを示唆していますコンパイルモードを正確に追跡ソース - >クラスファイルマッピングとなりません再コンパイルTokens.scala
余分な笑いのために、あなたはそれでclass Tokens
を持っている別のソース・ファイルを持っている場合、コンパイラが行うかもしれないものについて考えます。
は、あなたがややJavaの規則に従うと、少なくともソースと同じ名前のファイル内の1つのクラス/オブジェクトを持つことになりますと仮定し、ツーリングのかなりがまだありますファイルベース名。