如何创建一个单独的 sbt 配置或任务来使用 WartRemover 进行编译



WartRemover是一个scalac插件。通常,它是通过 sbt 插件配置的。

我希望能够在我的 sbt 项目上运行 WartRemover 作为单独的配置或任务,而不会影响通常的compile运行。

将 Wartremover 添加到我的plugins.sbt后,我尝试了以下很多变化。

lazy val Lint = config("lint").extend(Compile)
project("foo").
  configs(Lint)
  settings(inConfig(Lint)(Defaults.compileSettings): _*).
  settings(inConfig(Linting)(wartremover.wartremoverSettings):_*).
  settings(inConfig(Linting)(wartremover.wartremoverErrors := wartremover.Warts.all))

之后,scalacOptions大致包含我在新的lint配置和compile配置中的预期。但是,当我在调试模式下使用 sbt 运行 lint:compilecompile时,我可以看到 scalac 的命令行参数,两个命令或两个命令都不会导致通过-P:wartremover:...开关。这令人惊讶,因为只有lint:scalacOptions显示了-P:wartremover:...开关。

如何创建一个单独的 sbt 配置或任务来使用 WartRemover 编译而不影响compile:compile

我认为你非常接近。以下是一些详细信息:

  1. SBT 下载库依赖项和编译器插件Compile所有这些都使用配置的update任务,该任务使用libraryDependencies设置。 addCompilerPlugin是具有CompilerPlugin配置的libraryDependencies的简写。
  2. 编译器插件需要scalaOptions您感兴趣的配置。
  3. 您需要从Compile中获取sources才能在Lint中使用它们。

如果您看到wartremoverSettings的实现,它正在执行addCompilerPluginscalacOptions。您有两种选择可以在Compile上禁用疣除药:

  1. 使用自动插件(需要sbt 0.13.5+(注入wartremoverSettings,然后手动从Compile中删除wartremover编译器插件。
  2. 禁用自动插件,然后手动将疣去除剂添加到libraryDependencies中。

这是第一个选项。

项目/生成属性

sbt.version=0.13.7

project/wart.sbt

addSbtPlugin("org.brianmckenna" % "sbt-wartremover" % "0.11")

build.sbt

lazy val Lint = config("lint") extend Compile
lazy val foo = project.
  configs(Lint).
  settings(inConfig(Lint) {
    Defaults.compileSettings ++ wartremover.wartremoverSettings ++
    Seq(
      sources in Lint := {
        val old = (sources in Lint).value
        old ++ (sources in Compile).value 
      },
      wartremover.wartremoverErrors := wartremover.Warts.all
    ) }: _*).
  settings(
    scalacOptions in Compile := (scalacOptions in Compile).value filterNot { _ contains "wartremover" }
  )

foo/src/main/scala/Foo.scala

package foo
object Foo extends App {
  // Won't compile: Inferred type containing Any
  val any = List(1, true, "three")
  println("hi")
}

示例输出

foo> clean
[success] Total time: 0 s, completed Dec 23, 2014 9:43:30 PM
foo> compile
[info] Updating {file:/quick-test/wart/}foo...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Compiling 1 Scala source to /quick-test/wart/foo/target/scala-2.10/classes...
[success] Total time: 1 s, completed Dec 23, 2014 9:43:33 PM
foo> run
[info] Running foo.Foo 
hi
[success] Total time: 0 s, completed Dec 23, 2014 9:43:37 PM
foo> lint:compile
[info] Compiling 1 Scala source to /quick-test/wart/foo/target/scala-2.10/lint-classes...
[error] /quick-test/wart/foo/src/main/scala/Foo.scala:5: Inferred type containing Any
[error]   val any = List(1, true, "three")
[error]       ^
[error] /quick-test/wart/foo/src/main/scala/Foo.scala:5: Inferred type containing Any
[error]   val any = List(1, true, "three")
[error]             ^

相关内容

  • 没有找到相关文章

最新更新