Почему sbt запускает разрешение зависимостей каждый раз после очистки?

SBT запускает разрешение зависимостей каждый раз после clean, даже если конфигурация управления зависимостями проекта не изменилась. Это занимает много времени при работе на сервере CI.

Но документация говорит:

  • Обычно, если никакая конфигурация управления зависимостями не изменилась с момента последнего успешного разрешения, и восстановленные файлы по-прежнему present, sbt не просит Айви выполнить разрешение.

Как я могу остановить sbt от выполнения зависимостей при каждом создании проекта с помощью sbt clean publish-local?

Обновление

Я обнаружил, что sbt также выполняет разрешение при входе в интерактивный режим с sbt.

Update2

Поскольку @Ezhik указывает, могу ли я сохранить target/resolution-cache, тогда sbt не будет определять зависимости после очистки. Поэтому я попытался вывести resolution-cache из целевого каталога:

ivyConfiguration <<= (externalResolvers, ivyPaths, offline, checksums, appConfiguration, target, streams) map { (rs, paths, off, check, app, t, s) =>
        val resCacheDir = t / ".." / "resolution-cache"
        new InlineIvyConfiguration(paths, rs, Nil, Nil, off, Option(lock(app)), check, Some(resCacheDir), s.log)
      }

Теперь с этим кодом в Build.scala кэш проекта помещается в корень проекта и поэтому сохраняется после clean, но разрешение все равно выполняется. Поэтому я предполагаю, что этот подход неправильный или недостаточный.

Ответ 1

Из-за каталога target/resolution-cache, содержащего отчеты Ivy. Очевидно, что вы удаляете весь контент target во время clean операции.

IMHO Вы должны указать его в своем проекте где-то вне target, если вы хотите сохранить состояние разрешения.

Обновление.

vs SBT.0.12.4.RC1

  • Найти, где используется resolution-cache - в IvyConfiguration
  • Проверьте, где находится IvyConfiguration - в области проекта

    > inspect ivy-configuration
    [info] Task: sbt.IvyConfiguration
    [info] Description:
    [info]  General dependency management (Ivy) settings, such as the resolvers and paths to use.
    [info] Provided by:
    [info]  {file:/home/ezh/projects/sbt/}xsbt/*:ivy-configuration
    [info] Dependencies:
    [info]  xsbt/*:offline
    
  • Исправьте его в файле build.sbt.

    ivyConfiguration <<= (ivyConfiguration, baseDirectory) map {
      case (c: InlineIvyConfiguration, b) => import c._
        new InlineIvyConfiguration(paths, resolvers, otherResolvers, moduleConfigurations,
         localOnly, lock, checksums, resolutionCacheDir.map(_ => b / "123"), log)
      case (other, _) => other // something unknown
    }
    

4 Test... Ups... разрешение все еще активно... Расследуйте. →

Кэш

target/scala-2.10/cache/default-920e5d/global/update/output содержит указатели на resolution-cache:)

  • Исправить.

    cacheDirectory <<= baseDirectory / "234"
    

Test. Понял. Разрешение пропускается.

Сводные изменения для требуемой конфигурации:

ivyConfiguration <<= (ivyConfiguration, baseDirectory) map {
  case (c: InlineIvyConfiguration, b) => import c._
    new InlineIvyConfiguration(paths, resolvers, otherResolvers, moduleConfigurations,
     localOnly, lock, checksums, resolutionCacheDir.map(_ => b / "123"), log)
  case (other, _) => other // something unknown
}
cacheDirectory <<= baseDirectory / "234"

vs SBT.0.13.x

@deprecated("Use the cacheDirectory provided by streams.", "0.13.0")

https://github.com/sbt/sbt/issues/1208

Ответ 2

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

    offline := true

Ответ 3

Это работает для меня 0.13.1.

cleanKeepFiles ++= Seq("resolution-cache", "streams").map(target.value / _)

Ответ 4

Вы можете предотвратить clean удаление определенных файлов с помощью этого параметра:

// path should be adapted for newer sbt versions
cleanKeepFiles <+= cacheDirectory / "update"