Вопрос

FSC перекомпийте мои файлы .scala Каждый раз, даже нет необходимости - я могу скомпилировать его дважды, не редактируя ничего между попытками, и он компилярует их! Например, у меня есть 2 файла

Hello.scala.

class Hello{
  print("hello")
}

И токенс.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 скомпилировать проект с нуля, я вижу следующий вывод:

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 Acts Acts Acts Smart в случае Hello.scala (без компиляции) и действует немой в случае токенов. Я предполагаю, что проблема как-то связана с наследством, но это все.

Так что не так?

Это было полезно?

Решение

Мне не нравится много публиковать вещи, написанные другими, но я думаю, что этот вопрос заслуживает более полного ответа, что то, что было строго спросить.

Итак, прежде всего, fsc Перекомпилируйте все по умолчанию, период. это ant, нет fsc, что уходит Hello.scala Из-за того, что имя файла соответствует имени класса. Это не уходит Tokens.scala потому что нет никакого класса Tokens скомпилирован - так, в отсутствие Tokens.class, это перекомпилировано Tokens.scala.

Это не то, что делать со скалью. Scala отличается в одном фундаментальном аспекте от Java в этом из-за технических ограничений на JVM, изменение в trait Требуется перекомпиляция каждого класса, объекта или создания, которая его использует.

Теперь можно исправить ant Задача сделать умнее, начиная с SCALA 2.8. Я принимаю эту информацию от blogtrader.net.net.net Caoyuan, плагин Scala для славы NetBeans. Вы определяете задачу 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 Просто не достаточно умно, чтобы выяснить, что нужно перекомпилировать или нет. Это также рассказывает Варенье Чтобы создать файл, содержащие зависимости компиляции, и используйте алгоритм транзитивной зависимости, чтобы выяснить, что нужно перекомпилировать или нет.

Вам также необходимо изменить цель init, чтобы включить каталог сборки в классе сборки, так как Scala потребуется, чтобы перекомпилировать другие классы. Это должно выглядеть так:

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

Для получения более подробной информации, пожалуйста, обратитесь к блогу Caoyuan.

Другие советы

Токенс.scala перекомпилируется, потому что нет файла классов, совпадающих на его базенаме. То есть он не производит файл токенов. При речении, если исходный файл должен быть скомпилирован, FSC ищет класс с тем же базовым имеем, и если файл класса не существует или время модификации в исходном файле, позже, чем в файле класса, исходный файл будет восстановлен Отказ Если вы можете, я предлагаю вам посмотреть в Простой инструмент сборки, его непрерывный режим компиляции точно отслеживает источник-> классный карт и не перекомпирован токенс.

Для дополнительных смеха, подумайте, что может сделать компилятор, если у вас есть другой исходный файл, который имеет class Tokens в этом.

Несмотря на то, что SCALA позволяет произвольно открывать классы / объекты в любом исходном файле, все еще довольно много инструментов, который предполагает, что вы в некоторой степени следуют, следуя Java Conventer, и, по крайней мере, иметь один класс / объект в файле с тем же именем, что и исходный файл BaseName.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top