2011-07-08 70 views
10

我试图设置SBT来编译一个不使用maven目录结构的现有项目。我现在用的是full configuration并且已经设置了我的JavaSource & resourceDirectory设置如下:在SBT中筛选资源

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

现在我希望能够过滤我们包括在罐子神器的资源,因为我们目前有蚂蚁做,再加上排除。 java文件作为我们的资源与源代码混合在一起。例如:

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

有没有办法做到这一点?

+0

只是通知人们看这个问题,这是SBT 0.10。 –

+0

值得创建一个sbt10标签吗?它与sbt07非常不同... – opyate

+1

一个子通知 - 'defaultExcludes'已弃用,用于'excludeFilter' in sbt 0.11 – wbarksdale

回答

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" 

在原来的蚂蚁文件集,包含和排除的过滤器选择互斥文件集,所以只有一个是必要。

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

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

**方法选择匹配FileFilter论点,即所有后代。您可以通过运行show unmanaged-resources来验证是否按照预期选择了这些文件。

+0

如果我想排除.java文件,我可以只包含一个特定的文件集吗?如果可能的话,我推测否定一个'sbt.FileFilter'会起作用。 –

+0

没有互补的'includes'设置或任何东西。源代码有'sourceFilter',类路径有'classpathFilter',但没有资源。把它们统一在'include in unmanagedResources'之类的东西下会很有用,所以你可能会[打开一个bug](https://github.com/harrah/xsbt/issues)。否定'FileFilter'是可能的,但在这里没有帮助。 –

+0

我编辑了答案,包括如何直接构建资源设置。 –