为什么sbt每次清理后运行依赖解析?

时间:2013-06-19 12:06:12

标签: scala sbt ivy

即使项目依赖关系管理配置未更改,SBT也会在clean之后每次运行依赖项解析。在CI服务器上运行时,这非常耗时。

但文档says

  
      
  1. 通常,如果自上次成功解析后没有依赖关系管理配置发生更改,并且检索到的文件仍然存在   目前,sbt并未要求Ivy执行解决方案。
  2.   

每次使用sbt clean publish-local构建项目时,如何阻止sbt进行依赖项解析?

更新

我发现当我使用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之后保留,但无论如何都要进行解析。所以我认为这种方法是错误的或不充分的。

4 个答案:

答案 0 :(得分:9)

由于目录target/resolution-cache包含常春藤报告。很明显,您在target操作时删除了所有clean内容。

恕我直言如果你想保留解决状态,你必须将它指向你的项目中target以外的某个地方。

更新

vs SBT.0.12.4.RC1

  1. 在IvyConfiguration
  2. 中查找使用resolution-cache的位置
  3. 检查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
    
  4. 将其修复为build.sb。

    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
    }
    
  5. 4测试... Ups ...分辨率仍然有效...调查。 - &GT;

    target/scala-2.10/cache/default-920e5d/global/update/output缓存包含指向resolution-cache的指针:)

    1. 修复它。

      cacheDirectory <<= baseDirectory / "234"
      
    2. 测试。得到它了。分辨率被跳过。

      所需配置的摘要更改:

      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

答案 1 :(得分:6)

您可能有SNAPSHOT依赖项。它们随时都有变化,因此必须在每次运行时解决。你可以用

来抑制它
    offline := true

答案 2 :(得分:6)

这适用于0.13.1。

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

答案 3 :(得分:4)

您可以使用以下设置阻止clean删除某些文件:

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