scala - SBT:排除资源子目录

标签 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

最佳答案

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")

关于scala - SBT:排除资源子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318321/

相关文章:

java - Checkstyle - 方法按修饰符排序

Gradle 7 迁移 : Failed to apply PublishPlugin (maven-publish): Cannot run afterEvaluate when the project is already evaluated

android - 签名 APK 构建失败重新 :play-services-ads-identifier. 属性冲突

scala - 让 Maven 和 SBT 使用本地 Artifactory-server

SBT 子项目无法识别插件命令

scala - 你如何使用 Scala 2.11 和 sbt 0.13 运行 cucumber ?

scala - 抽象类型与类型参数

scala - 有没有一种方法可以链接以getOrElse一样的方式返回Option-Type的方法,但保留option-type

parsing - 将 Haskell Parsec 语法翻译成 Scala?

scala - scala 是否有类似于 jython 的独立 jar 的东西?