在 build.sbt 中过滤类

Posted

技术标签:

【中文标题】在 build.sbt 中过滤类【英文标题】:Filtering classes in build.sbt 【发布时间】:2018-07-15 13:34:02 【问题描述】:

Play enhancer docs 表示可以为特定的类/包启用它。可以通过这种方式完成(我假设在 build.sbt 中):

sources in (Compile, playEnhancerGenerateAccessors) := 
  ((javaSource in Compile).value / "models" ** "*.java").get

我不习惯 sbt/scala,我想知道如何在这样的过滤中提供多个包。如果我可以选择具有指定注释的类,那就更好了。是否可以?

编辑: 所以这个问题的动机是为了提高 Play Framework 项目的编译速度。事实证明,即使我只增强特定包,编译速度也基本相同。这很奇怪,因为完全关闭 PlayEnchancer,我的项目的编译时间几乎减少了一半(30 秒)。

【问题讨论】:

【参考方案1】:

作用域sources 设置为该播放增强器任务存储一组文件,此示例仅过滤具有给定模式的文件:

(javaSource in Compile).value 应该是你项目中的src/main/java/ 目录 / "models" 表示您只在 src/main/java/models/ 中查找 ** "*.java" 在所有子目录中搜索任何带有.java 扩展名的文件 .get 只评估匹配模式的文件列表

如果您想组合多个模式,可以使用 +++--- 运算符:

sources in (Compile, playEnhancerGenerateAccessors) := 
  val green = base / "green" ** "*.java"
  val blue  = base / "blue" ** "*.java"
  val red   = base / ** "*red*"
  (green +++ blue --- red).get

在 sbt 中,这些模式被称为 Path Finders,您可以在 sbt 文档中了解如何使用它们 Paths。由于这只是通过路径/名称过滤文件,我认为您不能以这种方式选择具有指定注释的类。

【讨论】:

以上是关于在 build.sbt 中过滤类的主要内容,如果未能解决你的问题,请参考以下文章

在 build.sbt 和 project/plugins.sbt 中避免冗余/重用 ModuleID?

如何在 sbt 子项目 build.sbt 文件中获取对当前项目的引用

在 build.sbt 中使用 Jenkins 内部版本号通过 sbt-native-packager 构建 RPM

build.sbt 和 build.scala 有啥区别?

如何在 ScalaJS build.sbt 中设置 mainClass?

在 Play 2.3 的 build.sbt 中应该如何定义 routesImport?