scala sbt ivy

scala - ¿Por qué sbt ejecuta la resolución de dependencias cada vez que se limpia?



ivy (4)

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

Pero la documentación says :

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

¿Cómo puedo evitar que sbt realice la resolución de dependencias cada vez que construyo un proyecto con sbt clean publish-local ?

Actualizar

Descubrí que sbt también ejecuta la resolución cuando entro en modo interactivo con sbt .

Actualización2

Como @Ezhik señaló que si puedo preservar target/resolution-cache , sbt no resolverá las dependencias después de limpiar. Así que traté de mover resolution-cache fuera del directorio de destino:

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 , el caché de resolución se coloca en la raíz del proyecto y, por lo tanto, se conserva después de la clean , pero la resolución se realiza de todos modos. Entonces asumo que este enfoque es incorrecto o insuficiente.


Debido al directorio de target/resolution-cache que contiene informes de Ivy. Es obvio que elimina todo target contenido de target mientras se realiza la operación de clean .

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

Actualizado.

vs SBT.0.12.4.RC1

  1. Encuentre dónde se usa la resolution-cache - en IvyConfiguration
  2. Inspeccione dónde se encuentra IvyConfiguration - en el alcance del proyecto

    > 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 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 Prueba ... Ups ... la resolución aún está activa ... Investigar. ->

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

  1. Arreglalo.

    cacheDirectory <<= baseDirectory / "234"

Prueba. Lo tengo. La resolución se omite.

Resumen de 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


Esto funciona para mí en 0.13.1.

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


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

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


Puede ser que tenga dependencias de SNAPSHOT. Están sujetos a cambios en cualquier momento, por lo que deben resolverse en cada ejecución. Puedes suprimir esto con

offline := true