Pergunta

O FSC recompila meus arquivos .scala toda vez que não há necessidade - posso compilá -lo duas vezes sem editar nada entre tentativas e recompilá -los! Por exemplo, eu tenho 2 arquivos

Olá.scala

class Hello{
  print("hello")
}

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

Quando peço Ant para compilar o projeto do zero, vejo a seguinte saída:

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

Do que eu não edito nada e peço a formiga de novo:

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 você pode ver, o FSC atua inteligente no caso de hello.scala (sem recompilação) e age burro no caso de tokens.scala. Sugiro que o problema esteja de alguma forma relacionado à herança, mas isso é tudo.

Então, o que está errado?

Foi útil?

Solução

Não gosto de muito postar coisas escritas por outras pessoas, mas acho que essa pergunta merece uma resposta mais completa de que o que foi estritamente feito.

Então, primeiro de tudo, fsc Recompila tudo por padrão, período. Isso é ant, não fsc, que está saindo Hello.scala fora, porque o nome do arquivo corresponde ao nome da classe. Não está saindo Tokens.scala fora porque não há aula chamada Tokens compilado - então, na ausência de um Tokens.class, ele recompilado Tokens.scala.

Essa é a coisa errada a ver com Scala. Scala difere em um aspecto fundamental de Java nisso, devido a limitações técnicas na JVM, uma mudança em um trait requer recompilação de todas as classes, objeto ou instanciação que a usa.

Agora, pode -se consertar o ant Tarefa para fazer uma coisa mais inteligente, começando com o Scala 2.8. Estou tirando esta informação de BlogTrader.net por Caoyuan, do Plugin Scala para a fama da NetBeans. Você define a tarefa do Scala no alvo de construção, como abaixo:

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

Diz ant para recompilar tudo, como ant Simplesmente não é inteligente o suficiente para descobrir o que precisa ser recompilado ou não. Também diz Scala Para criar um arquivo contendo dependências de compilação e use um algoritmo de dependência transitivo para descobrir o que precisa ser recompilado ou não.

Você também precisa alterar o destino init para incluir o diretório de compilação no Build ClassPath, pois o Scala precisará de recompilar outras classes. Deve ser assim:

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

Para mais detalhes, consulte o blog de Caoyuan.

Outras dicas

Tokens.scala é recompilado porque não há um arquivo de classe que corresponda ao seu nome de base. Isto é, ele não produz um arquivo tokens.class. Ao decidir se um arquivo de origem deve ser compilado, o FSC procura um arquivo de classe com o mesmo nome de base e se o arquivo de classe não existe ou o tempo de modificação no arquivo de origem é posterior ao do arquivo de classe, o arquivo de origem será reconstruído . Se você puder, sugiro que você olhe para Ferramenta de construção simples, seu modo de compilação contínuo rastreia com precisão a fonte-> mapeamento de classes e não recompile tokens.scala

Para risadas extras, pense no que o compilador pode fazer se você tiver um arquivo de origem diferente que tenha class Tokens iniciar.

Embora o Scala permita classes/objetos públicos arbitrários em qualquer arquivo de origem, ainda há muitas ferramentas que pressupõem que você siga um pouco a Convenção Java e pelo menos terá uma classe/objeto no arquivo com o mesmo nome que o nome de origem do nome da base.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top