首页 > 解决方案 > 如何正确过滤 sbt 源生成器文件进行编译?

问题描述

我正在使用外部库作为 Scala 源生成器。该库在提供的路径中吐出 .scala 文件和资源。

如果我只是将库改编为Task[Seq[File]]

Compile / sourceGenerators += Def.task {
   SomeCodeGenLib.genCode(
     (Compile / resourceDirectory).value / "schema.yaml",
     (Compile / sourceManaged).value
   )
}.taskValue,

...资源文件被视为 Scala 源并传递给编译失败的 scalac。

所以我只是尝试添加 includeFilter 或 excludeFilter,但这些似乎只适用于 unmanagedSource,而不是托管:

// These settings does not work:
managedSources / includeFilter := "*.scala" || "*.java",

sbt 还抱怨其他人没有使用这些设置键:

[warn] there are 2 keys that are not used by any other settings/tasks:
[warn]  
[warn] * api / managedSources / excludeFilter
[warn]   +- /Users/viktor/dev/…… / build.sbt:192
[warn] * api / managedSources / includeFilter
[warn]   +- /Users/viktor/dev/…… / build.sbt:193

所以下一个想法是过滤任务中的文件:

Compile / sourceGenerators += Def.task {
   val generatedFiles = SomeCodeGenLib.genCode(
     (Compile / resourceDirectory).value / "schema.yaml",
     (Compile / sourceManaged).value
   )
   generatedFiles.filter(f => f.getName().endsWith(".scala")) 
}.taskValue

......这是我似乎到达任何地方的唯一方法。但这真的是正确的方法吗?

标签: scalasbt

解决方案


推荐阅读