过滤SBT中的资源

时间:2011-07-08 16:16:22

标签: scala sbt

我正在尝试设置SBT来编译一个不使用maven目录结构的现有项目。我正在使用full configuration并设置了我的javaSource& resourceDirectory设置如下:

def settings = Defaults.defaultSettings ++ Seq(
    resourceDirectory in Compile <<= baseDirectory( _ / "java" ),
    javaSource in Compile <<= baseDirectory( _ / "java" )
)

现在我希望能够过滤我们在jar工件中包含的资源,就像我们目前使用ant一样,加上排除.java文件,因为我们的资源与源代码混合在一起。例如:

<fileset dir="java" includes="**/*.txt, **/*.csv" excludes="**/*.java" />

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:6)

defaultExcludes任务使用unmanagedResources作用域,并可选择使用配置。例如,此设置从主要资源中排除.java文件:

defaultExcludes in Compile in unmanagedResources := "*.java"

in Compile将此设置限制为仅适用于主要资源。通过使用in Test代替它,它仅适用于测试资源。通过省略配置(即,没有in Compilein Test),该设置将适用于主资源和测试资源。

in unmanagedResources仅对资源应用这些排除。例如,要将排除应用于源,范围将为in unmanagedSources。非托管部分的原因是要强调这些仅适用于非托管(或手动编辑)的源。

defaultExcludes键的类型为sbt.FileFilter,因此设置值必须为此类型。在上面的示例中,"*.java"被隐式转换为FileFilter。 *被解释为通配符,因此过滤器接受名称以“.java”结尾的文件。要合并过滤条件,请使用||&&。例如,如果还需要排除.scala文件,:=的参数将为:

"*.java" || "*.scala"

在原始Ant文件集中,include和exclude过滤器选择互斥的文件集,因此只需要一个。

也可以直接为Seq[File]构建unmanagedResources。例如:

unmanagedResources in Compile <<=
  unmanagedResourceDirectories in Compile map { (dirs: Seq[File]) =>
    ( dirs ** ("*.txt" || "*.csv" -- "*.java") ).get
  }

**方法选择与FileFilter参数匹配的所有后代。您可以通过运行show unmanaged-resources来验证是否按预期选择了文件。