【问题标题】:Why sbt runs dependency resolution every time after clean?为什么 sbt 每次清理后都运行依赖解析?
【发布时间】:2013-06-15 23:00:58
【问题描述】:

SBT 每次在 clean 之后运行依赖解析,即使项目依赖管理配置没有更改。在 CI 服务器上运行时,这很耗时。

但是文档says:

  1. 通常情况下,如果自上次成功解析后没有更改依赖管理配置并且检索到的文件仍然 目前,sbt 不要求 Ivy 执行解析。

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

更新

我发现当我使用sbt 进入交互模式时,sbt 也会运行分辨率。

更新2

正如@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 之后保留,但无论如何都会进行分辨率。所以我认为这种方法是错误的或不足的。

【问题讨论】:

    标签: scala sbt ivy


    【解决方案1】:

    因为目录target/resolution-cache 包含常春藤报告。很明显你在clean操作的时候删除了所有target的内容。

    恕我直言,如果您想保留分辨率状态,您必须在项目中将其指向 target 之外的某个位置。

    已更新。

    与 SBT.0.12.4.RC1

    1. 在 IvyConfiguration 中查找 resolution-cache 的使用位置
    2. 检查 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
      
    3. 在 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 测试... Ups... 分辨率仍然有效... 调查。 ->

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

    1. 修复它。

      cacheDirectory <<= baseDirectory / "234"
      

    测试。知道了。跳过分辨率。

    所需配置的汇总更改:

    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"
    

    与 SBT.0.13.x

    @deprecated("Use the cacheDirectory provided by streams.", "0.13.0")
    

    https://github.com/sbt/sbt/issues/1208

    【讨论】:

    • 自己动手? SBT 非常有表现力。对你特别好:))) 对我来说是一个有趣的案例。
    • +1,很好的答案@Ezhik。遗憾的是,这个解决方案不适用于 sbt 0.13。 cacheDirectory 已被弃用(就依赖解决方案而言,cacheDirectory 已被有效删除)。我还没有在 0.13 上找到一个可行的解决方案,令人沮丧的是让 sbt 检查每次清理/编译的更新。
    • @virtualeyes:想出适用于 0.13.x 的有效解决方案有什么运气吗?
    【解决方案2】:

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

    来抑制它
        offline := true
    

    【讨论】:

    • 我知道快照。事实并非如此。 Sbt 为所有可用的依赖项运行解析。
    • 对不起,我应该在哪里应用这行代码 build.sbt?您能否提供一些背景信息...
    • @khebbie 在您的 sbt 命令行 (REPL) 中运行 set offline := true 或使用 sbt "set offline := true" run 运行 sbt。理论上你也可以将它添加到你的 build.sbt 中,但是你总是需要编辑你的构建文件来切换离线模式。
    【解决方案3】:

    这在 0.13.1 上适用于我。

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

    【讨论】:

    • 在 0.13.2 中为我工作,您需要将该行单独添加到所有子项目中
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 2015-07-18
      • 2021-01-29
      • 1970-01-01
      • 2018-12-19
      相关资源
      最近更新 更多