SBT на IntelliJ требует очень долгого обновления

У меня довольно большой проект (15+ подпроектов), который имеет множество внешних зависимостей. Когда я изменяю хотя бы одну строку в build.sbt, а затем ударяю обновление, IntelliJ продолжает разрешать различные зависимости в течение очень долгого времени (30 + минута).

Предполагается, что это так медленно? Использование sbt из командной строки занимает не более 30 секунд.

Я использую -

Macbook pro mid 2015 with 16 GB ram
IntelliJ IDEA Ultimate 2017.2.5
sbt 0.13.13 
scala 2.11.11

Ответ 1

Я включил оболочку SBT внутри IntelliJ, как предложено @y.bedrov, и теперь обновление выполняется так же быстро, как и в командной строке!

Настройки > Сборка, выполнение, развертывание > Инструменты сборки > SBT > установите флажок "Использовать оболочку SBT для сборки и импорта".

Ответ 2

Одна вещь может помочь - это кэшированное разрешение зависимостей, которое доступно с sbt 0.13.7. Посмотрите здесь: http://www.scala-sbt.org/1.0/docs/Cached-Resolution.html, но в основном вам необходимо включить следующие настройки для всех проектов в вашей сборке:

updateOptions := updateOptions.value.withCachedResolution(true)

Благодаря этой настройке мне удалось сократить время обновления проекта IntelliJ с 15 до 3 минут. Все еще не идеал, но способ более управляемый.

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

Ответ 3

Ответы Kakaji и Haspemulator помогли мне импортировать до ~ 3 минут при сборке проекта ~ 40. В дополнение к этому я узнал, что большую часть времени в IntelliJ SBT импорт был потрачен на получение зависимостей от Ivy как часть команды updateClassifiers.

Это происходит каждый раз, когда вы выполняете импорт, если флажок "Библиотечные источники" включен при импорте проекта. Я ожидаю, что это будет медленнее, если вы также проверите 'sbt sources', потому что это означает, что больше библиотек будет разрешено.

Одним из способов ускорения updateClassifiers является использование coursier для разрешения зависимостей. Я просто добавил следующую строку в project/plugins.sbt, и теперь она импортируется через ~ 1 минуту.

addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.1")

Вы можете больше узнать о updateClassifiers медленном при https://github.com/sbt/sbt/issues/1930

Ответ 4

Я использую комбинацию из 2 выше (- Настройки> Сборка, Выполнение, Развертывание> Инструменты сборки> SBT> Проверка "Использовать оболочку SBT для сборки и импорта" - coursier

со следующим глобальным build.sbt:

    // file: ~/.sbt/0.13/plugins/build.sbt
    // purpose: add jar utils useful for development, but not wanted to projects' build.sbt

    // much better depts resolvement and fetching
    // usage: sbt update
    // https://github.com/coursier/coursier#why
    resolvers += Resolver.sonatypeRepo("snapshots")
    addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-SNAPSHOT")


    // enable this one if you want to use the local artifacts in your local repo's
    // ~/.ivy2/local/
    // ~/.ivy2/cache/
    // instead of the remote ones
    // updateOptions := updateOptions.value.withLatestSnapshots(false)


    resolvers ++= Seq(
       "typesafe" at "https://dl.bintray.com/typesafe/ivy-releases/",
       "Maven External Releases" at "https://artifactory-espoo1.ext.net.nokia.com/artifactory/public-maven-remotes/"
    )


    // eof file: ~/.sbt/0.13/plugins/build.sbt