SBT 1.7.2如何为不同开发阶段配置不同scalacOptions
在SBT 1.7.2中为开发/代码清理阶段配置不同scalacOptions
开发流程通常分为两个阶段:
- 开发调试阶段:快速探索解决方案、验证概念、编写临时代码,这段代码难免存在冗余、死代码、未使用导入等问题,允许带警告编译能提升开发效率。对应场景是执行
test:compile时,使用空的scalacOptions。 - 代码清理阶段:提交终版代码或Pull Request前的优化环节,需要用严格编译规则排查潜在问题。对应场景是执行
test、package或distTgz任务时,启用指定的严格编译选项。
下面是两种可行的配置方案:
方案一:自动绑定任务触发严格编译
这种方式让test/package/distTgz自动触发严格编译,无需手动传参,适合团队统一规范:
// 定义严格编译选项集合 val scalaCompilerOptions = Seq( "-Xfatal-warnings", "-Xlint:-missing-interpolator,_", "-Xlint:adapted-args", "-Xlint:constant", "-Xlint:-byname-implicit", "-Ywarn-unused:imports", "-Ywarn-unused:patvars", "-Ywarn-unused:privates", "-Ywarn-unused:locals", "-Ywarn-unused:explicits", "-Ywarn-unused:params", "-Ywarn-unused:implicits", "-Ywarn-value-discard", "-Ywarn-dead-code", "-deprecation", "-feature", "-unchecked" ) // 默认使用宽松模式(空编译选项) scalacOptions := Seq.empty // 定义前置任务:切换到严格选项并重新编译主、测试源码 lazy val enforceStrictCompile = taskKey[Unit]("Switch to strict scalac options and recompile") enforceStrictCompile := { scalacOptions := scalaCompilerOptions (Compile / compile).value (Test / compile).value } // 让需要严格检查的任务依赖这个前置任务 Test / test := (Test / test).dependsOn(enforceStrictCompile).value Compile / packageBin := (Compile / packageBin).dependsOn(enforceStrictCompile).value // 若使用sbt-native-packager的distTgz,按实际插件路径调整 Universal / distTgz := (Universal / distTgz).dependsOn(enforceStrictCompile).value
方案二:手动通过命令行参数切换模式
这种方式更灵活,日常开发用默认宽松模式,需要严格检查时加参数触发:
val scalaCompilerOptions = Seq( "-Xfatal-warnings", "-Xlint:-missing-interpolator,_", "-Xlint:adapted-args", "-Xlint:constant", "-Xlint:-byname-implicit", "-Ywarn-unused:imports", "-Ywarn-unused:patvars", "-Ywarn-unused:privates", "-Ywarn-unused:locals", "-Ywarn-unused:explicits", "-Ywarn-unused:params", "-Ywarn-unused:implicits", "-Ywarn-value-discard", "-Ywarn-dead-code", "-deprecation", "-feature", "-unchecked" ) // 根据系统属性判断使用哪种编译选项 scalacOptions := { sys.props.get("strictCompile") match { case Some("true") => scalaCompilerOptions case _ => Seq.empty } }
使用方式:
- 开发调试(宽松模式):
sbt test:compile - 代码清理(严格模式):
sbt -DstrictCompile=true test、sbt -DstrictCompile=true package或sbt -DstrictCompile=true distTgz
方案对比
- 方案一适合团队协作,避免有人忘记执行严格检查就提交代码。
- 方案二适合需要临时绕过严格规则的场景,自由度更高。
内容的提问来源于stack exchange,提问作者pawel.panasewicz
相关产品推荐
相关产品推荐

