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
相关产品推荐
相关产品推荐

