sbt插件 - 自己的配置类路径不完整

时间:2016-11-10 16:23:53

标签: scala sbt

我想为新类型的测试创建一个sbt插件。为了简单起见,我创建了一个小的模糊测试插件,类似于sbt docs中提到的插件。

我的插件类目前看起来像这样:

package sbtfuzz

import sbt._, Keys._

object FuzzPlugin extends sbt.AutoPlugin {
  override def requires = plugins.JvmPlugin
  override def trigger = allRequirements

  object autoImport {
    lazy val Fuzz = config("fuzz") extend(Compile)
  }
  import autoImport._

  lazy val baseFuzzSettings: Seq[Def.Setting[_]] = Seq(
    test := {
      println("fuzz test")
    }
  )
  override lazy val projectSettings = inConfig(Fuzz)(baseFuzzSettings) ++ inConfig(Fuzz)(Defaults.compileSettings)
}

我在comaprison中为文档中的代码添加的唯一内容是编译代码的get任务的inConfig(Fuzz)(Defaults.compileSettings)

如果我执行sbt fuzz:compile,则编译src/fuzz/scala中的来源。但是如果源对实际项目代码有依赖性(就像所有测试一样),编译就会失败,因为找不到类。我猜是因为fuzz:fullClasspath只有一个条目:

[info] * Attributed(.../fuzz/target/scala-2.10/sbt-0.13/fuzz-classes)

test:fullClasspath具有项目类及其中的依赖项:

[info] * Attributed(.../fuzz/target/scala-2.10/sbt-0.13/test-classes)
[info] * Attributed(.../fuzz/target/scala-2.10/sbt-0.13/classes)
[info] * Attributed(~/.ivy2/cache/org.scala-lang/scala-library/jars/scala-library-2.10.4.jar)
[info] * Attributed(~/.ivy2/cache/org.scala-sbt/sbt/jars/sbt-0.13.13.jar)
...

这种方式test:compile能够成功编译测试类,fuzz:compile无法编译。

如何以fuzz配置的方式配置test配置,包括所有项目依赖项?

谢谢!

修改 我发现(在我看来)相当肮脏的解决方法:

lazy val baseFuzzSettings: Seq[Def.Setting[_]] = Seq(
  fullClasspath in Fuzz ++= (dependencyClasspath in Test).value,
  dependencyClasspath in Fuzz ++= (dependencyClasspath in Test).value,
  ...
)

有了这个,我可以成功编译我的fuzz类。是否有更明智的方法来做到这一点?谢谢!

1 个答案:

答案 0 :(得分:0)

对于测试配置,请使用Defaults.testSettingsDefaults.testTasks。请注意,订单很重要:

inConfig(Fuzz)(Defaults.testSettings ++ Defaults.testTasks ++ baseSettings)