2015-01-08 3 views
0

Мне часто приходится выполнять некоторые длительные эксперименты в scala, и обычно я запускаю второй экземпляр sbt для того же проекта, где я вношу изменения в код, который выполняется в другом экземпляре и компилируется. Причина, по которой я делаю это, заключается в том, что мне не нужно ждать завершения долгого процесса, прежде чем я смогу добиться прогресса с моим кодом.Scala - sbt: Безопасно ли компилировать во время работы?

Мой вопрос: безопасно ли это сделать или существует вероятность того, что перекомпиляция частей текущего кода в sbt/scala вызовет проблемы в моем рабочем процессе?

То, что я наблюдал до сих пор, заключается в том, что большую часть времени это нормально, но я однажды столкнулся с ошибкой класса, когда рефакторинг моего кода во время работы.

+1

Не уверен в sbt/scala, но JVM, безусловно, способен к ленивым загрузкам, поэтому можно быть в ситуации, когда класс, который еще не был загружен, изменен или удален под ногами JVM. – marcus

ответ

4

Как упоминалось в @marcus, компилятор, записывающий файл .class, который еще не загружен вашей JVM-запуском, имеет шанс быть загруженным и не соответствовать другим скомпилированным классам. Во многих случаях все будет хорошо, но это может вызвать проблемы. Есть несколько вещей, которые вы можете сделать в этой ситуации:

  1. Компиляция в отдельных каталогах. Проверьте свой код на два совершенно разных каталога и сделайте локальные коммиты (при условии, что вы используете git), чтобы нажать/вытащить из одной копии репозитория в другую. Это гарантирует, что ваше тестирование не получит изменения компиляции, пока вы не будете готовы (когда вы «вытащите» из репозитория разработки).
  2. Используйте автоматическую систему CI, такую ​​как Jenkins или Travis, чтобы запускать тесты на каждой фиксации. Это будет, подобно # 1, не противоречить вашей разработке, так как это отдельная проверка кода.
  3. Используйте sbt-revolver, который запускает программу в отдельной JVM с помощью команды re-start и перезапускает ее всякий раз, когда есть изменения. Однако это прервало бы ваше тестирование.
  4. Используйте JRebel, который лучше выполняет перезагрузку классов, чем JVM или большинство IDE.
Смежные вопросы