Why sbt runs dependency resolution every time after clean?

前端 未结 4 1667
被撕碎了的回忆
被撕碎了的回忆 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: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

提交回复
热议问题