Scala 如何创建单独的sbt配置或任务以使用WartRemover进行编译?
是一个scalac插件。通常,它是通过配置 我希望能够在sbt项目上作为一个单独的配置或任务运行WartRemover,而不影响编译的正常运行 在将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): _*
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进行编译而不影响编译:编译?我想你已经接近了。以下是一些细节:
Compile
configuration的update
任务下载库依赖项和编译器插件,该任务使用libraryDependencies
设置addCompilerPlugin
是libraryDependencies
与CompilerPlugin
配置的缩写scalaOptions
Compile
中获取源代码,以便在Lint
中使用它们
addCompilerPlugin
和scalacOptions
。您有两个选项可以在编译时禁用wartremover:
wartremover设置
,然后从编译
手动删除wartremover编译器插件库依赖项中
你是说自定义命令吗@冈斯泰德,我不反对自定义命令。我只是不太明白如何通过必要的配置让它执行“编译”。谢谢你的帮助!你的建议完全符合我的期望。我似乎不需要从编译中删除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] ^