scala - 使用 sbt 进行 token 替换(资源过滤)

标签 scala maven sbt

我正在 SBT 中寻找与 Maven 相同的资源过滤功能,但不是现成的。

在这里和其他地方进行了大量搜索后,我发现有两个插件功能接近,但没有一个真正做到了。例如,xsbt-filter不过滤诸如 ${baseDirectory} 之类的标记,而 sbt-editsource 不与单元或集成测试一起工作(参见 issue 9)

所以,我尝试通过修改这两个插件之一来自己编写代码,但这是我在 SBT 中无法弄清楚的问题,因为我是新手(而不是 Scala 专业人士):

您如何重用 SBT build设置来进行 token 解析?

这些设置在对象 sbt.Keys 中。例如,baseDirectory 是:

val baseDirectory = SettingKey[File]("base-directory")

有几十个(也许数百个)可用于解析资源文件中的标记。

最后,为了在插件代码中进行 token 解析,您需要映射 Map[String, String] 键中存在的所有build设置,即键是“baseDirectory”,值是是编译时该值的任何值。

我假设一种方法是使用反射,但在走这条路之前,我想我问过是否有更标准的方法从 sbt 插件中执行此操作,这看起来相当基本。

到目前为止我见过的所有插件都将每个键设置(将变量名称转换为键的字符串)复制并粘贴到它们的插件代码中。


对于那些不熟悉资源过滤的人来说,这意味着构建工具应该能够解析资源文件中存在的所有标记,并在编译时将资源文件替换为它的值(示例:资源文件是“/User/me/Documents/myproject/src/test/resources/myfile.txt”,其中文本有一个字符串${target},其中“target"是键,"/User/me/Documents/myproject/target"恰好是它在特定构建中的值。

最佳答案

In the end, for doing token resolution within the plugin code, you need a map Map[String, String] of all build settings present in Keys, i.e. key is "baseDirectory" and the value is whatever at compile time that value is.

sbt 内部保留这些信息,因此您可以查询它们。 例如,sbt 中有一个名为 inspect 的命令,它会告诉您设置的当前值,以及它使用的所有其他依赖项。前一段时间我写了一个插件,递归调用它并在 ASCII 艺术树中打印出来,叫做 sbt-inspectr: https://github.com/eed3si9n/sbt-inspectr .

还有 Project.runTask(...),您可能需要它。

关于scala - 使用 sbt 进行 token 替换(资源过滤),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36510188/

相关文章:

scala - SBT,在构建的 jar 中包含整个外部目录(带有目录本身)

shell - 识别文件夹的构建类型

scala - 有没有办法覆盖 sbt-native-packager 中的 init 脚本模板?

mysql - 如何使用虚拟实体数据预填充数据库?

java - 在 SBT/Play 中的构建定义内运行 Java 方法

Scala:如何测试调用System.exit()的方法?

scala - 组合偏函数

scala - [A,Future [B]]到Future [E [[A,B]]

scala - 为什么这个递归函数不起作用

java - 仅从 Maven 测试调用 init 方法失败 ested 异常为 java.lang.UnsupportedOperationException