質問

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を持っている別のソース・ファイルを持っている場合、コンパイラが行うかもしれないものについて考えます。

Scalaはすべてのソース・ファイル内の任意のpublicクラス/オブジェクトが許可されていますが、

は、あなたがややJavaの規則に従うと、少なくともソースと同じ名前のファイル内の1つのクラス/オブジェクトを持つことになりますと仮定し、ツーリングのかなりがまだありますファイルベース名。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top