Question

FSC recompile mes fichiers .scala chaque fois même il n'y a pas besoin - je peux compiler deux fois sans modifier quoi que ce soit entre les tentatives et les recompile! Par exemple, j'ai 2 fichiers

Hello.scala

class Hello{
  print("hello")
}

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

Quand je demande à la fourmi de compiler projet à partir de zéro, je vois sortie suivante:

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

Que je ne pas modifier quoi que ce soit et demander fourmi recompiler:

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

Comme vous pouvez le voir, fsc agit intelligent en cas de Hello.scala (pas recompilation) et agit muet en cas de Tokens.scala. Je suggère que le problème est lié en quelque sorte avec l'héritage, mais qui est tout.

Alors qu'est-ce qui ne va pas?

Était-ce utile?

La solution

Je n'aime pas beaucoup des choses d'affichage écrit par d'autres, mais je pense que ce question mérite une réponse plus complète que ce qui était strictement demandé.

Alors, tout d'abord, fsc recompile tout par défaut, la période. Il est ant, pas fsc, qui quitte Hello.scala, parce que le nom du fichier correspond au nom de classe. Il ne quitte pas Tokens.scala parce qu'il n'y a pas de classe appelée Tokens compilé -. Si, en l'absence d'un Tokens.class, il recompilé Tokens.scala

C'est la mauvaise chose à faire avec Scala. Scala se distingue dans un aspect fondamental de Java qui, en raison de limitations techniques sur machine virtuelle Java, un changement dans un trait nécessite recompilation de chaque classe, objet ou instanciation qui l'utilise.

Maintenant, on peut fixer la tâche ant de faire une chose plus intelligente en commençant par Scala 2.8. Je prends ces informations de blogtrader.net par Caoyuan, de plug-in Scala pour la gloire Netbeans. Vous définissez la tâche Scala sur la cible de construction comme ci-dessous:

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

Il raconte ant recompiler tout, comme ant est tout simplement pas assez intelligent pour comprendre ce qui doit être recompilé ou non. Il dit aussi Scala pour créer un fichier contenant des dépendances de compilation, et utiliser un algorithme de dépendance transitive à comprendre ce qui doit être recompilé ou non.

Vous devez également modifier la cible init pour inclure le répertoire de construction dans la construction classpath, comme Scala aura besoin que de recompiler autres classes. Il devrait ressembler à ceci:

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

Pour plus de détails, reportez-vous s'il vous plaît sur le blog de Caoyuan.

Autres conseils

Tokens.scala est recompilé parce qu'il n'y a pas un fichier de classe correspondant à son nom de base. À savoir, il ne produit pas un fichier Tokens.class. Au moment de décider si un fichier source doit être compilé, fsc cherche un ClassFile avec le même nom de base et si le fichier de classe n'existe pas ou la date de modification du fichier source est postérieure à celle du fichier de classe, le fichier source sera reconstruit . Si vous le pouvez, je vous suggère de regarder dans simple outil de construction, son continu compiler le mode suivi précis source-> ClassFile cartographie et ne recompiler Tokens.scala

Pour rires supplémentaires, pensez à ce que le compilateur peut faire si vous avez un fichier source différent qui a class Tokens en elle.

Bien que scala permet aux classes publiques arbitraires / objets dans un fichier source, il y a encore un peu d'outillage suppose que vous aurez un peu suivre la convention de java et au moins avoir une classe / objet dans le fichier avec le même nom que la source fichier basename.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top