是否可以在从SBT命令行运行时将scalac的警告当作错误以致编译失败,但在IDE(IntelliJ IDEA)中不这样做?

编程语言 2026-07-09

我的SBT构建设计为在编译时若存在任何未使用的程序元素,或对Scala编译器的其他警告进行调用时就让构建失败,按照 scalac-Werror-Wunused 选项来实现:

scalacOptions ++= Seq(
  "-Werror",
  "-Wunused"
)

这样做的初衷,是希望在构建阶段就捕捉到编程问题,既能在本地,也能在提交后在我们的CI环境中验证时发现。

然而,在我在IDE(IntelliJ IDEA)中编写和修改代码时,可能想要临时引入会产生警告的代码。例如,我可能想把某些代码注释掉,以在没有这段代码的情况下检查测试行为。按照我当前的警告设置,这可能会引发一个“未使用”的警告,甚至在IDE中也会阻止我对这段代码进行编译。

我可以注释掉 -Werror 设置在 build.sbt 中,并让我的IDE重新构建项目,但这比逐个文件增量重新编译要慢得多。

我突然意识到,我真正想要的是,在从命令行完整构建以及我的CI环境(sbt compile)运行时让构建失败,但在我在IDE中工作时不失败。

有没有办法实现这个目标?特别是,是否有办法告诉SBT(或IntelliJ IDEA),在IDEA内编译时出现编译器警告就允许构建成功完成,而在IDEA之外运行时出现这些警告就让构建失败?

解决方案

IDEA在运行SBT时,会将 idea.managed 系统属性设为 true。构建可以利用这个属性,只有在未设置该属性或它不为 true 时,才向 scalacOptions 中添加 "-Werror"

scalacOptions ++= Seq("-Wunused")
scalacOptions ++= (if (sys.props("idea.managed") == "true") Nil else Seq("-Werror"))

有了这个配置,当从终端、CI或任何在IDEA IDE之外的环境中运行构建时,编译将失败。然而,在IDEA中运行时,编译将成功。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章