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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:39:56