Ужас компиляции scala sbt из-за медлительности и различных проблем

У меня очень ужасное время кодирования в scala с использованием sbt. Я знаю, что компиляция в scala по своей сути медленная по сравнению с java.

Я пробовал и eclipse, и intellij для разработки в scala + sbt, и обе хорошо знакомые IDE отстойно работают. Пожалуйста, помогите мне со следующими ужасами, с которыми я сталкиваюсь:

  1. Как сократить время компиляции до миллисекунд в scala (так же, как это было для java) даже для больших проектов.... в IDE (eclipse/intellij).... учитывая, что я использую sbt

  2. Как обеспечить пошаговую работу сборок в IDE только с измененными файлами. Я наблюдаю, что полная сборка происходит в среде IDE при каждом изменении кода/сохранении файла... опять же, имейте в виду, что я использую sbt

  3. Пожалуйста, предложите то же самое для командной строки после каждого изменения кода, когда я делаю пакет sbt, и кажется, что sbt перекомпилирует весь проект, а не измененные файлы.

  4. В intellij, когда я пытаюсь запустить модульные тестовые примеры, весь проект на основе sbt снова компилируется

  5. Кроме того, если я импортирую проект в intellij и одновременно использую командную строку sbt, сборка intellij и сборка из командной строки плохо взаимодействуют друг с другом, и я начинаю наблюдать полные компиляции в intellij и запутанные ошибки компиляции.


person Saby    schedule 30.11.2015    source источник


Ответы (2)


Это только частичный ответ, потому что он во многом зависит от того, что вы делаете и как выглядит ваш код, но я обычно не использую IDE для компиляции/тестов. Вместо этого я запускаю это в sbt (иногда с другими командами, в зависимости от того, что я делаю)

> ~test-quick

который (цитирование документации):

  • Тесты, которые не прошли в предыдущем запуске
  • Тесты, которые раньше не запускались
  • Тесты, которые имеют одну или несколько транзитивных зависимостей, возможно, в другом проекте, перекомпилированы.

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

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

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

Редактировать в соответствии с просьбой Саби

Прежде чем я перейду к пунктам, которые вы подняли, я просто хочу отметить, что это не на самом деле ужасы, а eclipse/intellij на самом деле не отстой в том, что они делают. На самом деле, если подумать, впечатляет, что они вообще работают.

Scala гораздо более сложный язык, чем java, а это означает, что компилятор должен делать гораздо больше, чем java. Здесь я говорю о таких функциях, как макросы, неявные значения и вывод типов. Эти функции не бесплатны, и время компиляции и память здесь будут хитами. (в основном потому, что компилятору приходится делать всевозможные сумасшедшие вещи для вывода типов; многократно запускать код для макросов; и т. д., и т. д., и т. д.)

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

В любом случае, по пунктам:

  1. Я честно не знаю, что ответить на этот вопрос. В настоящее время я работаю над небольшим java-проектом (думаю, дюжина зависимостей, несколько тысяч строк кода, какая-то пружина, но больше ничего не происходит), и я, конечно, не получаю время компиляции в миллисекундах в Intellij. Если это действительно вызывает проблемы, то мое единственное предложение — использовать командную строку.

  2. Я вообще ничего не знаю о eclipse, но если вы используете Intellij 13 вы можете установить инкрементный компилятор следующим образом. Плагин sbt был немного изменен в Intellij 14, поэтому я не думаю, что это вариант больше (т.е. он делает то, что делает)

  3. Я думаю, что мой ответ выше охватывает это. Дело в том, что вам не нужно использовать пакет sbt, и я обычно этого не делаю. Вместо этого введите sbt, а когда он загрузится, введите ~test-quick и запускайте пакет sbt только тогда, когда вам нужно.

  4. Вероятно, именно так работает intellij. Как и 3, я не думаю, что вы можете изменить это больше

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

Что еще нужно учитывать

Настройка может быть важна. Большинство хардкорных разработчиков Scala, которых я знаю, кодируют в возвышенном тексте или emacs, используя плагин под названием ensime и sbt в командной строке для тестирования. / скомпилируйте его (вместе с репликой или двумя). В противном случае (во всяком случае, на момент написания этого) большинство других людей (включая меня) используют Intellij для написания своего кода, а затем либо используют sbt в командной строке, либо сам Intellij для тестирования/компиляции. Вам нужно поиграть и найти то, что лучше для вас.

Еще одна вещь, о которой вы хотите подумать, это версия sbt, на которой вы работаете. У меня нет тестов для этого, но я помню, что старые версии были медленнее, и было бы болезненно менять способ работы только потому, что вы используете старую версию чего-то.

Также убедитесь, что у вас установлен java 8 sdk — я знаю, что девушки и парни из Typesafe тратят все больше и больше времени на оптимизацию sbt для java 8.

person Hamish    schedule 30.11.2015
comment
не могли бы вы уточнить ответ, как указано в самом вопросе - person Saby; 30.11.2015
comment
вы просили об этом? Я подумаю и обновлю свой ответ - person Hamish; 30.11.2015

Пункты 2 и 4 у меня просто работают (и работают уже давно), никакой специальной настройки не требуется.

  1. Кроме того, если я импортирую проект в intellij и одновременно использую командную строку sbt, сборка intellij и сборка из командной строки плохо взаимодействуют друг с другом, и я начинаю наблюдать полные компиляции в intellij и запутанные ошибки компиляции.

Это должно быть исправлено в новой версии подключаемого модуля Scala.

person Alexey Romanov    schedule 01.12.2015