【问题标题】:token substitution (resource filtering) with sbt使用 sbt 进行令牌替换(资源过滤)
【发布时间】:2016-04-08 22:16:38
【问题描述】:

我正在 SBT 中寻找与 Maven 具有相同的资源过滤功能,但不是开箱即用的。

在这里和其他地方进行了相当多的搜索后,我发现了两个功能接近的插件,但都没有真正做到。例如,xsbt-filter 不会过滤诸如${baseDirectory} 之类的标记,而 sbt-editsource 不能与单元测试或集成测试结合使用(请参阅issue 9

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

您如何重用 SBT 构建设置来进行令牌解析?

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

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

有几十个(可能数百个)可用于解析资源文件中的令牌。

最后,为了在插件代码中进行令牌解析,您需要一个映射 Map[String, String] 存在于 Keys 中的所有构建设置,即 key 是“baseDirectory”,值是编译时的任何值。

我认为一种方法是使用反射,但在走这条路之前,我想我问是否有一个更标准的方法可以从 sbt 插件中做到这一点,这似乎相当基本。

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


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

【问题讨论】:

    标签: scala maven sbt


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2011-10-01
      • 2023-04-11
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多