¿Por qué sbt ejecuta la resolución de dependencias cada vez después de clean?


SBT ejecuta la resolución de dependencias cada vez después de clean incluso si la configuración de administración de dependencias del proyecto no ha cambiado. Esto consume mucho tiempo cuando se ejecuta en el servidor CI.

Pero la documentación dice: :

  1. Normalmente, si ninguna configuración de administración de dependencias ha cambiado desde la última resolución exitosa y los archivos recuperados siguen presente, sbt no le pide a Ivy que realice la resolución.

¿Cómo puedo detener sbt ¿de hacer la resolución de dependencias cada vez que compilo un proyecto con sbt clean publish-local ?

Update

He descubierto que sbt también ejecuta resolución cuando entro en modo interactivo con sbt.

Update2

Como @Ezhik señaló si puedo preservar target/resolution-cache entonces sbt no resolverá las dependencias después de limpiar. Así que traté de moverme resolution-cache desde el dir objetivo:

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)
      }

Ahora con este código en Build.scala la caché de resolución se coloca en la raíz del proyecto y, por lo tanto, se conserva después de clean, pero la resolución se está haciendo de todos modos. Así que asumo que este enfoque es incorrecto o insuficiente.

Author: Oleksandr.Bezhan, 2013-06-19

4 answers

Debido al directorio target/resolution-cache que contiene informes Ivy. Obviamente es que elimina todo el contenido target mientras funciona clean.

En mi humilde opinión, debe apuntar en su proyecto a algún lugar fuera de target si desea preservar el estado de resolución.

Actualizado.

Vs SBT.0.12.4.RC1

  1. Encuentra dónde se usa resolution-cache - en IvyConfiguration
  2. Inspeccionar dónde se encuentra IvyConfiguration-en el proyecto ámbito de aplicación

    > 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
    
  3. Arreglarlo en la compilación.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 Prueba... UPS... la resolución sigue activa... Investigar. ->

target/scala-2.10/cache/default-920e5d/global/update/output la caché contiene punteros a resolution-cache :)

  1. Solucionarlo.

    cacheDirectory <<= baseDirectory / "234"
    

Prueba. Lo tengo. Se omite la resolución.

Resumen de los cambios para la configuración requerida:

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

 9
Author: Ezhik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-24 04:39:06

Puede ser que tenga dependencias de INSTANTÁNEAS. Están sujetos a cambios en cualquier momento, por lo que deben resolverse en cada carrera. Puede suprimir esto con

    offline := true
 6
Author: stefan.schwetschke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-19 12:36:50

Esto funciona para mí en 0.13.1.

cleanKeepFiles ++= Seq("resolution-cache", "streams").map(target.value / _)
 6
Author: Golly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 12:40:13

Puede evitar que clean elimine ciertos archivos con esta configuración:

// path should be adapted for newer sbt versions
cleanKeepFiles <+= cacheDirectory / "update"
 4
Author: jrudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-15 09:25:59