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

时间:2014-12-19 23:06:12

标签: scala sbt scalac

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

我希望能够在我的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:...开关。

如何在不影响compile:compile的情况下创建单独的sbt配置或任务以使用WartRemover进行编译?

1 个答案:

答案 0 :(得分:10)

我觉得你非常接近。以下是一些细节:

  1. sbt使用Compile配置的update任务下载库依赖项和编译器插件,该任务使用libraryDependencies设置。 addCompilerPluginlibraryDependencies CompilerPlugin配置的简写。
  2. 编译器插件在您感兴趣的配置上需要scalaOptions
  3. 您需要从sources抓取Compile以在Lint中使用它们。
  4. 如果您看到wartremoverSettings的实施,它同时执行addCompilerPluginscalacOptions。您有两种方法可以在Compile上禁用wartremover:

    1. 使用自动插件(需要sbt 0.13.5+)来注入wartremoverSettings,然后从Compile手动删除wartremover编译器插件。
    2. 停用自动插件,然后手动将疣去除器添加到libraryDependencies
    3. 这是第一个选项。

      项目/ build.properties

      sbt.version=0.13.7
      

      项目/ 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" }
        )
      

      富/ SRC /主/阶/ 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]             ^