Pregunta

FSC vuelve a compilar los archivos de mi .scala cada vez, incluso no es necesario - que puede compilar dos veces sin editar nada entre los intentos y se los vuelve a compilar! Por ejemplo, tengo 2 archivos

Hello.scala

class Hello{
  print("hello")
}

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

Cuando le pregunto a la hormiga para compilar proyecto desde cero veo siguiente resultado:

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

De lo que no hago nada de edición y compilación de hormigas pido de nuevo:

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

Como se puede ver, fsc actúa inteligente en caso de Hello.scala (sin recompilación) y actúa muda en caso de Tokens.scala. Sugiero que el problema está relacionado de alguna manera con la herencia, pero eso es todo.

Así que lo que está mal?

¿Fue útil?

Solución

No me gusta mucho material publicación escrito por otros, pero creo que esta pregunta merece una respuesta más completa que lo que estaba estrictamente preguntó.

Por lo tanto, en primer lugar, fsc vuelve a compilar todo por defecto, y punto. Es ant, no fsc, que está dejando Hello.scala a cabo, debido a que el nombre del archivo coincide con el nombre de la clase. No es dejar Tokens.scala a cabo porque no hay una clase llamada Tokens compilado -. Por lo tanto, en ausencia de un Tokens.class, se vuelve a compilar Tokens.scala

Eso es lo peor que ver con Scala. difiere Scala en un aspecto fundamental de Java en el que, debido a las limitaciones técnicas de JVM, un cambio en un trait requiere recopilación de todas las clases, objetos o instancias que lo utiliza.

Ahora, uno puede fijar la tarea ant que hacer una cosa más inteligente a partir de Scala 2.8. Estoy tomando esta información de blogtrader.net por Caoyuan, de Scala Plugin para Netbeans fama. Se define la tarea Scala en el tipo de generación, como a continuación:

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

Se dice ant recompilar todo, como ant simplemente no es lo suficientemente inteligente como para saber lo que hay que volver a compilar o no. También le dice a Scala para crear un archivo que contiene las dependencias de compilación, y el uso de un algoritmo de dependencia transitiva de averiguar lo que hay que volver a compilar o no.

También es necesario cambiar el destino de inicio para incluir el directorio de construcción en la ruta de clase de construcción, como Scala tendrá que volver a compilar otras clases. Se debe tener este aspecto:

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

Para más detalles, consulte el blog de Caoyuan.

Otros consejos

Tokens.scala se vuelve a compilar porque no es un archivo de clase igualando su nombre base. Es decir, que no produce un archivo Tokens.class. Al decidir si un archivo fuente debe ser compilado, miradas FSC para un archivo de clase con el mismo nombre base y si el archivo de clase no existe o la fecha de modificación en el archivo de origen es posterior a la del archivo de clase, el archivo de origen será reconstruido . Si puede, le sugiero que usted busca en simple Construir herramienta, su continua el modo de compilación seguimiento preciso de source-> archivo de clase mapeo y no recompilación Tokens.scala

Para risas adicionales, pensar en lo que el compilador puede hacer si tiene un archivo de origen diferente que tiene class Tokens en ella.

A pesar de Scala permite que las clases públicas arbitrarias / objetos en cualquier archivo de origen, todavía hay un poco de herramientas que da por hecho que tanto seguir la convención de Java y por lo menos tener una clase / objeto en el archivo con el mismo nombre que la fuente archivo de nombre base.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top