我一直在为我的大多数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
答案 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)
}