过滤SBT中的资源

Jon*_*man 11 scala sbt

我正在尝试设置SBT来编译一个不使用maven目录结构的现有项目.我正在使用完整配置并设置了我的javaSource和resourceDirectory设置,如下所示:

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

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

<fileset dir="java" includes="**/*.txt, **/*.csv" excludes="**/*.java" />
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Mar*_*rah 7

使用defaultExcludes作用域来完成unmanagedResources任务和可选的配置.例如,此设置从主要资源中排除.java文件:

defaultExcludes in Compile in unmanagedResources := "*.java"
Run Code Online (Sandbox Code Playgroud)

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

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

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

"*.java" || "*.scala"
Run Code Online (Sandbox Code Playgroud)

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

也可以直接构建Seq[File]for unmanagedResources.例如:

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

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