我有一个资源生成器,它应该同时为Compile
和Test
运行。代码如下所示:
resourceGenerators in Compile += Def.task {
val log = streams.value.log
val source = (sourceDirectory in Compile).value / "isabelle"
val target = (resourceManaged in Compile).value / "isabelle"
if (source.exists()) {
log.info(s"Copying Isabelle sources from $source to $target")
IO.delete(target)
IO.copyDirectory(source, target)
val files = (target ** "*").get.filter(_.isFile)
val mapper = Path.rebase(target, "")
val contents = files.map(mapper).map(_.get).mkString("\n")
val list = target / ".libisabelle_files"
IO.write(list, contents)
list +: files
}
else {
Nil
}
}.taskValue
基本上,它会查找src/main/isabelle
文件夹中的所有文件,将其复制到resources_managed/main/isabelle
,并另外写入这些文件的列表。
到目前为止,此工作正常,但我也想支持src/test/isabelle
。显然,我可以复制上面的代码,但这似乎不太优雅(即使我将公共位拉出到函数中)。
我尝试在任何地方删除in Compile
,但这不起作用("References to undefined settings"
)。
答案 0 :(得分:4)
您想使用inConfig
:
val isabelleSettings = Seq(
resourceGenerators += Def.task {
val log = streams.value.log
val source = sourceDirectory.value / "isabelle"
val target = resourceManaged.value / "isabelle"
if (source.exists()) {
log.info(s"Copying Isabelle sources from $source to $target")
IO.delete(target)
IO.copyDirectory(source, target)
val files = (target ** "*").get.filter(_.isFile)
val mapper = Path.rebase(target, "")
val contents = files.map(mapper).map(_.get).mkString("\n")
val list = target / ".libisabelle_files"
IO.write(list, contents)
list +: files
}
else {
Nil
}
}.taskValue
)
inConfig(Compile)(isabelleSettings)
inConfig(Test)(isabelleSettings)
请参阅:
> test:products
[info] Copying Isabelle sources from /Users/dnw/Desktop/t-2016-02-22.1038/src/test/isabelle to /Users/dnw/Desktop/t-2016-02-22.1038/target/scala-2.11/resource_managed/test/isabelle
[info] Copying Isabelle sources from /Users/dnw/Desktop/t-2016-02-22.1038/src/main/isabelle to /Users/dnw/Desktop/t-2016-02-22.1038/target/scala-2.11/resource_managed/main/isabelle