Почему 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
:)
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"