SBT:排除资源子目录

时间:2015-10-24 12:40:54

标签: scala gradle sbt

我一直在为我的大多数Scala项目使用Gradle,但我想评估SBT作为替代品的适用性。我在Gradle中完成的一件事是从最终版本中排除某个资源目录(例如,使用CoffeeScript编写将作为最终资源包含的JavaScript文件)。

在Gradle中,我会这样做:

sourceSets {
    main {
        resources {
            exclude 'com/example/export/dev' // exclude development resources
        }
    }
}

这将从最终版本中排除资源包com.example.export.dev包。

我如何在SBT中做同样的事情?我试过了

unmanagedResourceDirectories in Compile -= (resourceDirectory in Compile).value / "com/example/export/dev"

但这没有做任何事情(我理解为什么,但这并没有真正帮助)。 SBT网站上的文档仅讨论了排除文件模式(Classpaths, sources, and resources)。

作为更具描述性的图片,请说我们有以下资源目录结构:

com
\---example
     \---export
         \---dev
         \---something

在最终输出中,我想要:

com
\---example
    \---export
        \---something

2 个答案:

答案 0 :(得分:3)

在SBT中思考的方式有点不同,我知道一开始可能很难。

在您的示例中,您需要修改生成资源文件的任务(或选择要查找资源文件的文件夹的任务)。

以下是我如何仅选择以字符' a'开头的资源文件的示例。

(unmanagedResources in Compile) := (unmanagedResources in Compile).value.filter(_.getName.startsWith("a"))

同样,如果要修改资源文件的整个目录,可以这样做:

(unmanagedResourceDirectories in Compile) := (unmanagedResourceDirectories in Compile).value.filter(_.getName.startsWith("a"))

显然我的过滤器只是示例,您可以使用Scala支持的任何复杂模式。

SBT的好处在于它具有互动性。因此,您只需在项目的REPL中键入以下内容即可检查任务结果:

> show compile:unmanagedResources
> show compile: unmanagedResourceDirectories

要检查任务的所有依赖项,请从REPL执行此操作:

> inspect tree compile:unmanagedResources

<强>假设:

SBT知道在哪里使用标准maven build directory layout查找所有资源。上述解决方案假定所有资源都在/resources目录下。然后,您可以使用getClass.getResource("/folderInsideResources/file.txt")从Scala代码访问它们。

以下是带有资源的混合Java / Scala项目的示例目录布局:

 .
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── a
    │   │           └── b
    │   │               └── Hello.java
    │   ├── resources
    │   │   ├── a.tx
    │   │   └── b.tx
    │   └── scala
    │       └── com
    │           └── a
    │               └── b
    │                   └── ScalaHello.scala
    └── test
        ├── resources
        └── scala
            └── com
                └── a
                    └── b
                        └── ScalaHello.scala

要访问资源文件,请使用:

 getClass.getResource("/a.txt")
 getClass.getResource("/b.txt")

答案 1 :(得分:1)

来自https://github.com/sbt/sbt-jshint/issues/14

excludeFilter in unmanagedResources := {
  val public = ((resourceDirectory in Compile).value / "com" / "example" / "export" / "dev").getCanonicalPath
  new SimpleFileFilter(_.getCanonicalPath startsWith public)
}