Scala SBT:插件依赖项和项目类路径

Scala SBT:插件依赖项和项目类路径,scala,sbt,Scala,Sbt,如何向SBT插件添加外部依赖项,并使其在项目和插件类路径上都可用 具体来说,我有一个简单的插件,可以运行我们的TestNG测试套件并进行一些后期处理。以下是一个简化版本: import sbt._ import java.util.ArrayList import Keys._ import org.testng._ object RunTestSuitesPlugin extends Plugin { lazy val runTestSuites = TaskKey[Unit]("run

如何向SBT插件添加外部依赖项,并使其在项目和插件类路径上都可用

具体来说,我有一个简单的插件,可以运行我们的TestNG测试套件并进行一些后期处理。以下是一个简化版本:

import sbt._
import java.util.ArrayList
import Keys._
import org.testng._

object RunTestSuitesPlugin extends Plugin {
  lazy val runTestSuites = TaskKey[Unit]("run-test-suites", "runs TestNG test suites")
  lazy val testSuites = SettingKey[Seq[String]]("test-suites", "list of test suites to run")

  class JavaListWrapper[T](val seq: Seq[T]) {
    def toJavaList = seq.foldLeft(new java.util.ArrayList[T](seq.size)) { (al, e) => al.add(e); al }
  }
  implicit def listToJavaList[T](l: Seq[T]) = new JavaListWrapper(l)

  def runTestSuitesTask = runTestSuites <<= (target, streams, testSuites) map {
    (targetDirectory, taskStream, suites) =>
      import taskStream.log
      log.info("running test suites: " + suites)
      runSuites(suites)
  }

  private def runSuites(testSuites: Seq[String]) = {
    var tester = new TestNG
    tester.setTestSuites(testSuites.toJavaList)
    tester.run()
  }

  def testSuiteSettings = {
    inConfig(Compile)(Seq(
      runTestSuitesTask,
      testSuites := Seq("testsuites/mysuite.xml"),
      libraryDependencies += "org.testng" % "testng" % "5.14"))
  }
}
导入sbt_
导入java.util.ArrayList
导入密钥_
导入org.testng_
对象RunTestSuitesPlugin扩展插件{
lazy val runTestSuites=TaskKey[Unit](“运行测试套件”、“运行测试套件”)
lazy val testSuites=SettingKey[Seq[String]](“测试套件”,“要运行的测试套件列表”)
类JavaListWrapper[T](val-seq:seq[T]){
def toJavaList=seq.foldLeft(new java.util.ArrayList[T](seq.size)){(al,e)=>al.add(e);al}
}
隐式def listToJavaList[T](l:Seq[T])=新的JavaListWrapper(l)

def runTestSuitesTask=runTestSuites我会尝试一个答案,但我对sbt的内部细节不是很熟悉

通常情况下,构建系统的路径(与您的程序相反)在project下,如前所述。这通常在
项目/plugins.sbt
中。听起来不错,因为您开发的应用程序没有理由关注构建系统使用的库,也没有理由关注构建系统使用的库

当你的插件运行应用程序代码时,这可能不是那么简单,很可能存在类路径/类加载器问题。我不确定它是否能工作。通常,你的插件应该实现一个测试框架,而不是定义自己的任务。因为sbt是有限的

测试框架应该在中实现
org.scalatools.testing.framework
。添加后,您的构建将考虑它

testFrameworks += new TestFramework("full.class.name")
当您运行普通测试命令时,它会让每个框架识别它所处理的测试类(两个条件可用:扩展某个基类或具有某个注释)并运行它们。框架在构建中运行,它会获得一个类装入器来访问应用程序代码


你可以看看(随sbt一起提供)。还有一个。我不知道,根据它的文档,它有点不正常,希望它能为你工作。

通过将TestNG直接添加到使用该插件的项目的Compile中的unmanagedJars来修复错误


我还没有找到任何资源来解释插件执行期间SBT类路径的结构,因此,如果有人试图解释为什么需要此步骤,我将不胜感激。

感谢您的澄清,不幸的是testng测试接口无法与我们的套件配合使用,这就是为什么我一起破解了一个小插件。我将为了避免实现一个完整的测试接口,我通常对插件中使用的依赖项在项目中运行时如何在类路径上可用感到困惑。感谢您的帮助,我成功地修复了问题的答案中所述的问题(虽然我不能完全确定它为什么有效——这总是有点不令人满意)。