SBT:输入任务按名称生成测试源
SBT: input task to generate a test source by name
我想创建一个 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
}
但是,即使它是在 sourceManaged 目录中创建的,sbt 测试也不会提取它。
但是,这有效:
sourceGenerators in Test += Def.task {
val file = (sourceManaged in Test).value / "FooSpec.scala"
IO.write(file, s"""class FooSpec extends AbstractSpec""")
Seq(file)
}.taskValue
但是,以上并不是我想要的 - 我想将 Foo 指定为参数。
那么,有什么方法可以将参数传递给 sourceGenerator 任务吗?或者创建一个任务,向托管源添加一些东西,以便 sbt 测试获取它?
此外,有什么方法可以遍历所有已编译源文件的文件名?如果我能做到这一点,我将简单地从源文件名本身生成所有 Spec.scala...
根据 this question 的建议,我尝试了这个:
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
我想创建一个 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
}
但是,即使它是在 sourceManaged 目录中创建的,sbt 测试也不会提取它。
但是,这有效:
sourceGenerators in Test += Def.task {
val file = (sourceManaged in Test).value / "FooSpec.scala"
IO.write(file, s"""class FooSpec extends AbstractSpec""")
Seq(file)
}.taskValue
但是,以上并不是我想要的 - 我想将 Foo 指定为参数。
那么,有什么方法可以将参数传递给 sourceGenerator 任务吗?或者创建一个任务,向托管源添加一些东西,以便 sbt 测试获取它?
此外,有什么方法可以遍历所有已编译源文件的文件名?如果我能做到这一点,我将简单地从源文件名本身生成所有 Spec.scala...
根据 this question 的建议,我尝试了这个:
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