【发布时间】:2015-10-12 17:16:14
【问题描述】:
假设我正在编写一个 Scala 库 L,它依赖于某些依赖项 D,并由程序 P 和另一个程序 Q 使用。P 直接依赖于 D 的 3.2 版,而 Q 直接依赖于 3.3 版。
在这两个版本之间,D 的 API 被改组,以便获得我在 L 中使用的相同函数,我必须在 L 中编写不同的导入语句。同样,P 依赖于 3.2 特定的行为,而 Q 依赖于 3.3 特定的行为。
现在,通常会发生的情况是在编译 P 和 Q 时会选择 D 的最新版本,但是如果 L 依赖于库的 3.3 版本,这将导致 P 中断,或者在编译 Q 时 L 中断如果 L 依赖于 D 的 3.2 版本。
我希望 P 和 Q 都使用相同版本的 L,因为 L 的公共 API 不会改变。这可能吗?
想到的一般方法是基于依赖解析的L的条件编译。尽管在 JVM 世界中这似乎无法实现,因为我们不会传递编译项目的依赖项,而是依赖预编译的工件。
如果 D 是 Scala 本身,我现在可以使用 SBT 执行此操作(即与不同的 Scala 版本交叉编译,并将特定于版本的代码存在于其自己的目录中),但从依赖关系解析的角度来看,这是一种 hack因为 SBT 更改了工件的名称以允许这种交叉编译工作。
【问题讨论】:
标签: scala sbt dependency-management conditional-compilation transitive-dependency