Why sbt runs dependency resolution every time after clean?

前端 未结 4 1665
被撕碎了的回忆
被撕碎了的回忆 2020-12-13 09:45

SBT runs dependency resolution every time after clean even if project dependency management configuration hasn\'t changed. This is time consuming when running o

相关标签:
4条回答
  • 2020-12-13 10:19

    You can prevent clean from deleting certain files with this setting:

    // path should be adapted for newer sbt versions
    cleanKeepFiles <+= cacheDirectory / "update"
    
    0 讨论(0)
  • 2020-12-13 10:32

    This works for me on 0.13.1.

    cleanKeepFiles ++= Seq("resolution-cache", "streams").map(target.value / _)
    
    0 讨论(0)
  • 2020-12-13 10:37

    Because of directory target/resolution-cache that contains Ivy reports. It is obviously that you remove all target content while clean operation.

    IMHO You must point it in your project to somewhere out from target if you want to preserve resolution state.

    Updated.

    vs SBT.0.12.4.RC1

    1. Find where resolution-cache is used - in IvyConfiguration
    2. Inspect where IvyConfiguration located - in project scope

      > 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. Fix it in 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... resolution is still active... Investigate. ->

    target/scala-2.10/cache/default-920e5d/global/update/output cache contain pointers to resolution-cache :)

    1. Fix it.

      cacheDirectory <<= baseDirectory / "234"
      

    Test. Got it. Resolution is skipped.

    Summary changes for required configuration:

    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

    0 讨论(0)
  • 2020-12-13 10:37

    Might be that you have SNAPSHOT dependencies. They are subject to change anytime so must be resolved on every run. You can suppress this with

        offline := true
    
    0 讨论(0)
提交回复
热议问题