Scala SBT:按名称生成测试源的输入任务

Scala SBT:按名称生成测试源的输入任务,scala,sbt,Scala,Sbt,我想创建一个sbt任务来生成测试源,例如sbt genSpec Foo应该在src_managed/test中生成FooSpec.scala 我试过这个: val genSpec = inputKey[File]("Generate spec file") genSpec := { import sbt.complete.DefaultParsers._ val log = streams.value.log val arg: String = spaceDelimited("&l

我想创建一个sbt任务来生成测试源,例如sbt genSpec Foo应该在src_managed/test中生成FooSpec.scala

我试过这个:

val genSpec = inputKey[File]("Generate spec file")

genSpec := {
  import sbt.complete.DefaultParsers._
  val log = streams.value.log
  val arg: String = spaceDelimited("<arg>").parsed.head //TODO: Single string parser!
  val fileName = s"${arg}Spec"
  log.info(s"Generating $fileName")
  val file = (sourceManaged in Test).value / s"$fileName.scala"
  IO.write(file, s"""class $fileName extends AbstractSpec""")
  //sourceGenerators in Test += file
  file
}
val genSpec = taskKey[Seq[File]]("Generate spec file")

genSpec := {
  import sbt.complete.DefaultParsers._
  val log = streams.value.log
  val args = spaceDelimited("<arg>").parsed
  args map {arg =>
    val fileName = s"${arg}Suite"
    log.info(s"Generating $fileName")
    val file = (sourceManaged in Test).value / s"$fileName.scala"
    IO.write(file, s"""class $fileName extends AbstractSuite""")
    file
  }
}


genSpec <<= (sourceGenerators in Test) { _.join.map(_.flatten.toList) }
但是,上面的内容并不是我想要的——我想指定Foo作为参数

那么,有没有办法将参数传递给sourceGenerator任务?或者创建一个任务,将某些内容添加到托管源中,以便sbt测试能够获取这些内容

另外,迭代所有编译源文件名的方法是什么?如果我能做到这一点,我将从源文件名本身生成所有Spec.scala

根据建议,我尝试了以下方法:

val genSpec = inputKey[File]("Generate spec file")

genSpec := {
  import sbt.complete.DefaultParsers._
  val log = streams.value.log
  val arg: String = spaceDelimited("<arg>").parsed.head //TODO: Single string parser!
  val fileName = s"${arg}Spec"
  log.info(s"Generating $fileName")
  val file = (sourceManaged in Test).value / s"$fileName.scala"
  IO.write(file, s"""class $fileName extends AbstractSpec""")
  //sourceGenerators in Test += file
  file
}
val genSpec = taskKey[Seq[File]]("Generate spec file")

genSpec := {
  import sbt.complete.DefaultParsers._
  val log = streams.value.log
  val args = spaceDelimited("<arg>").parsed
  args map {arg =>
    val fileName = s"${arg}Suite"
    log.info(s"Generating $fileName")
    val file = (sourceManaged in Test).value / s"$fileName.scala"
    IO.write(file, s"""class $fileName extends AbstractSuite""")
    file
  }
}


genSpec <<= (sourceGenerators in Test) { _.join.map(_.flatten.toList) }
但是,我有一个错误:

 error: `parsed` can only be used within an input task macro, such as := or Def.inputTask.
  val args = spaceDelimited("<arg>").parsed
                                     ^
试试这个:

val genSpec = inputKey[File]("Generate spec file")

genSpec := {
  import sbt.complete.DefaultParsers._
  val log = streams.value.log
  val arg: String = spaceDelimited("<arg>").parsed.head //TODO: Single string parser!
  val className = s"${arg}Spec"
  val file = (sourceManaged in Test).value / s"$className.scala"
  log info s"Generating $file"
  IO.write(file, s"""class $className extends AbstractSpec""")
  file
}

managedSources in Test ++= ((sourceManaged in Test).value ** "*Spec.scala").get