加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:00:42 所属栏目:安全 来源:网络整理
导读:WartRemover是一个scalac插件.通常它通过 sbt plugin配置. 我希望能够在我的sbt项目上运行WartRemover作为单独的配置或任务,而不会影响通常的编译运行. 将Wartremover添加到我的plugins.sbt后,我尝试了以下几种变体. lazy val Lint = config("lint").extend(
WartRemover是一个scalac插件.通常它通过 sbt plugin配置.

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

将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配置和编译配置中的预期.但是,当我运行lint时:在调试模式下使用sbt进行编译和编译,这样我就可以看到scalac的命令行参数,要么两个命令都导致传递-P:wartremover:…开关.这是令人惊讶的,因为只有lint:scalacOptions显示-P:wartremover:…开关.

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

解决方法

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

> sbt使用Compile配置的更新任务下载库依赖项和编译器插件,该任务使用libraryDependencies设置. addCompilerPlugin是具有CompilerPlugin配置的libraryDependencies的简写.
>编译器插件需要对您感兴趣的配置进行scalaOptions.
>您需要从Compile中获取源以在Lint中使用它们.

如果您看到wartremoverSettings的实现,那么它同时执行addCompilerPlugin和scalacOptions.您有两个选项可以在Compile上禁用wartremover:

>使用自动插件(需要sbt 0.13.5)来注入wartremoverSettings,然后从Compile手动删除wartremover编译器插件.
>禁用自动插件,然后手动将wart remover添加到libraryDependencies中.

这是第一个选择.

项目/ 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,2014 9:43:33 PM
foo> run
[info] Running foo.Foo 
hi
[success] Total time: 0 s,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,"three")
[error]       ^
[error] /quick-test/wart/foo/src/main/scala/Foo.scala:5: Inferred type containing Any
[error]   val any = List(1,"three")
[error]             ^

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读