Как создать отдельную конфигурацию sbt или задачу для компиляции с помощью WartRemover?
WartRemover является плагином scalac. Обычно он настраивается через плагин СБТ.
я хотел бы иметь возможность запускать WartRemover в моем проекте sbt как отдельную конфигурацию или задачу, не влияя на обычный запуск 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
конфигурации. Однако, когда я побежал lint:compile
и compile
С sbt в режиме отладки, чтобы я мог видеть аргументы командной строки для scalac, либо обе, либо ни одна из команд не приведет к передаче -P:wartremover:...
переключатели. Это было удивительно, потому что только lint:scalacOptions
показала -P:wartremover:...
переключатели.
как я могу создать отдельную конфигурацию sbt или задачу для компиляции с WartRemover, не затрагивая compile:compile
?
1 ответов
я думаю, вы были очень близки. Вот некоторые из деталей:
- sbt загружает зависимости библиотеки и плагины компилятора, используя
Compile
конфигурацииupdate
задача, которая используетlibraryDependencies
настройка.addCompilerPlugin
это сокращение отlibraryDependencies
СCompilerPlugin
конфигурации. - плагин компилятора требует
scalaOptions
о конфигурации, которая вас интересует. - вам нужно, чтобы захватить
sources
СCompile
использовать их вLint
.
если вы видите реализацию wartremoverSettings
это как addCompilerPlugin
и scalacOptions
. У вас есть два варианта, чтобы отключить wartremover на Compile
:
- используйте автоматический плагин (требуется sbt 0.13.5+) для инъекции
wartremoverSettings
, затем вручную удалите wartremover compiler plugin изCompile
. - отключить автоматический плагин, а затем вручную добавить бородавки remover в
libraryDependencies
.
вот первый выбор.
проект/построить.свойства
sbt.version=0.13.7
проект/бородавка.sbt
addSbtPlugin("org.brianmckenna" % "sbt-wartremover" % "0.11")
построить.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.скала!--45-->
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] ^
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] ^