You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SBT能否保留插桩类文件与非插桩类文件共存?

解决SBT coverage切换时重复编译的问题

可以通过配置不同的目标目录来区分插桩和非插桩的编译产物,避免切换时全量重新编译,具体配置方法如下:

  • 在build.sbt中添加条件配置,根据coverageEnabled的值指定不同的target目录:

    Compile / target := {
      val base = (ThisBuild / baseDirectory).value / "target"
      if (coverageEnabled.value) base / "covered" else base / "uncovered"
    }
    
    Test / target := {
      val base = (ThisBuild / baseDirectory).value / "target"
      if (coverageEnabled.value) base / "covered-test" else base / "uncovered-test"
    }
    

    开启coverage时,编译产物会放到target/covered和target/covered-test;关闭时放到target/uncovered和target/uncovered-test,切换时各自复用已有的编译文件,无需全量重新编译。

  • 多模块项目需确保每个模块应用该配置,可在公共设置中统一配置:

    val commonSettings = Seq(
      Compile / target := {
        val base = (ThisBuild / baseDirectory).value / "target" / moduleName.value
        if (coverageEnabled.value) base / "covered" else base / "uncovered"
      },
      Test / target := {
        val base = (ThisBuild / baseDirectory).value / "target" / moduleName.value
        if (coverageEnabled.value) base / "covered-test" else base / "uncovered-test"
      }
    )
    
    lazy val root = (project in file("."))
      .aggregate(module1, module2)
      .settings(commonSettings)
    
    lazy val module1 = (project in file("module1"))
      .settings(commonSettings)
    
    lazy val module2 = (project in file("module2"))
      .settings(commonSettings)
    

    给每个模块的目标目录加上模块名前缀,避免不同模块的编译产物互相干扰。

  • 注意事项:

    • 执行clean命令会清空所有目标目录,若只想清理单一状态的产物,需手动删除对应子目录,比如rm -rf target/covered。
    • 部分SBT插件可能依赖默认target目录结构,配置后若出现异常,需检查插件路径配置是否同步调整。

内容的提问来源于stack exchange,提问作者vlfig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:52:37