【问题标题】:sbt dependsOn, typesafe config merges application.confsbt dependsOn,类型安全配置合并 application.conf
【发布时间】:2017-03-06 03:33:55
【问题描述】:

我有一个包含两个模块的项目,A 和 B。每个都有一个application.conf 和一个local.conf,其中包括前者。我项目的build.sbt 文件指定:

B.dependsOn(A % "compile->compile")

似乎模块B 的local.conf 包括模块A 的application.conf,因为在尝试时,模块A 的application.conf 中的替换值出现UnresolvedSubstitution 异常运行模块B。

我认为它正在合并application.conf 文件。有没有办法阻止它这样做?特别是,我可以通过build.sbt 文件来完成吗?

【问题讨论】:

    标签: dependencies sbt typesafe-config


    【解决方案1】:

    当你这样做时:

    B.dependsOn(A % "compile->compile")
    

    当B 被编译时,它会执行A 编译并使其对B 可用。这意味着A 中的配置文件将可供B 使用,因为类型安全配置将这些配置放入类路径中。

    最简单的解决方案可能是命名您的属性,以便模块B 仅使用它自己的配置中的属性,而不是As。 (这是一个最佳实践,以保持关注点分离清晰。)如果意图是 B 的配置 覆盖 A 的“默认”配置,并假设 A本质上是B 使用的库,在best practice guideline here 之后,将resource.conf 文件放在A 中,在B 中放置一个application.conf 文件,因为application.conf 具有更高的优先级。

    在您的情况下,A 和 B 都依赖于公共代码。为了保持关注点的分离,最好将此通用代码重构到它自己的库模块中,并让A 和B 引用该代码。通过这种方式,您可以确保它们所依赖的属性都在C 中,而由A 或B 正确设置的属性仅在它们的域中。

    【讨论】:

    • 不幸的是,实际上 A 和 B 都是应用程序,而不是库,但是 A 恰好有一个我想要在 B 中编码的类,所以我想我会导入它以减少代码重复,因此依赖。那么,命名空间到底是什么意思?在这种情况下会有所帮助吗?
    • 如果有两个应用程序引用相似的类,通常会将这些类移动到两个应用程序都可以调用的库模块中。命名空间是指在你的属性上加上一个前缀,所以很清楚它在哪里。例如java.util.List 的命名空间是java.util,所以它不会与com.mystuff.shopping.List 混淆。在这种情况下,您可以使用 A.someproperty 和 B.someproperty。
    • 感谢 Nathaniel,我认为通用库解决方案是最佳的,我会使用它。我应该将上面的帖子标记为我的解决方案,还是我们中的一个人应该创建一个新的?
    • @Logician 完成!抱歉拖了这么久;是移动的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2020-04-24
    • 1970-01-01
    • 2019-07-28
    • 2013-09-17
    • 2019-10-28
    • 2017-06-11
    相关资源
    最近更新 更多