Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何创建单独的sbt配置或任务以使用WartRemover进行编译?_Scala_Sbt_Scalac - Fatal编程技术网

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

Scala 如何创建单独的sbt配置或任务以使用WartRemover进行编译?,scala,sbt,scalac,Scala,Sbt,Scalac,是一个scalac插件。通常,它是通过配置 我希望能够在sbt项目上作为一个单独的配置或任务运行WartRemover,而不影响编译的正常运行 在将Wartremover添加到我的plugins.sbt之后,我尝试了以下几种变体 lazy val Lint = config("lint").extend(Compile) project("foo"). configs(Lint) settings(inConfig(Lint)(Defaults.compileSettings): _*

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

我希望能够在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
配置和
compile
配置中大致包含了我所期望的内容。但是,当我在调试模式下使用sbt运行
lint:compile
compile
时,我可以看到scalac的命令行参数,两个或两个命令都会导致传递
-P:wartremover:…
开关。这令人惊讶,因为只有
lint:scalacOptions
显示了
-P:wartremover:…
开关


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

我想你已经接近了。以下是一些细节:

  • sbt使用
    Compile
    configuration的
    update
    任务下载库依赖项和编译器插件,该任务使用
    libraryDependencies
    设置
    addCompilerPlugin
    libraryDependencies
    CompilerPlugin
    配置的缩写
  • 编译器插件要求您感兴趣的配置上有
    scalaOptions
  • 您需要从
    Compile
    中获取
    源代码,以便在
    Lint
    中使用它们
  • 如果您看到它的实现,它同时执行
    addCompilerPlugin
    scalacOptions
    。您有两个选项可以在编译时禁用wartremover:

  • 使用自动插件(需要sbt 0.13.5+)注入
    wartremover设置
    ,然后从
    编译
    手动删除wartremover编译器插件
  • 禁用自动插件,然后手动将疣去除器添加到
    库依赖项中
  • 这是第一个选择

    project/build.properties 项目/wart.sbt build.sbt foo/src/main/scala/foo.scala 样本输出
    你是说自定义命令吗@冈斯泰德,我不反对自定义命令。我只是不太明白如何通过必要的配置让它执行“编译”。谢谢你的帮助!你的建议完全符合我的期望。我似乎不需要从编译中删除AutoPlugin添加的配置,我猜这是因为我的构建是在
    .scala
    文件中指定的。我错了:正如Eugene所说,我需要scalac选项上的过滤器来删除编译配置中传递给的wartremover开关。它没有注意到开关传递的任何效果,因为默认情况下,WartRemover插件会禁用所有的疣。但是,编译器在
    compile:compile
    期间仍在加载WartRemover插件,这并不是我想要的。添加
    默认值。compileSetting
    有什么作用?它在我们的构建中引发了一些问题;去掉它可以修复它们,而且似乎没有副作用。(我们的设置都是在惰性VAL中定义的,这些VAL被传递到项目的
    设置
    块中,除了
    名称
    版本
    组织
    之外,“顶层”中没有任何内容。
    sbt.version=0.13.7
    
    addSbtPlugin("org.brianmckenna" % "sbt-wartremover" % "0.11")
    
    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" }
      )
    
    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]             ^