gpt4 book ai didi

scala - 如何使用 SBT 帮助我的库解决传递依赖冲突

转载 作者:行者123 更新时间:2023-12-01 13:51:04 26 4
gpt4 key购买 nike

假设我正在编写一个 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 中断,或者如果 L 依赖于编译 Q,则 L 在编译 Q 时中断在 D 的 3.2 版上。

理想情况下,我希望 P 和 Q 都使用相同版本的 L,因为 L 的公共(public) API 不会改变。这可能吗?

想到的一般方法是基于依赖解析的L的条件编译。尽管在 JVM 世界中这似乎是无法实现的,因为我们不会传递地编译项目的依赖项,而是依赖于预编译的工件。

如果 D 是 Scala 本身,我现在可以使用 SBT 执行此操作(即与不同的 Scala 版本交叉编译,并将特定于版本的代码存在于其自己的目录中),但从依赖解析的角度来看,这是一种 hack,因为 SBT 发生了变化工件的名称以允许此交叉编译工作。

最佳答案

您可以告诉 sbt 将依赖关系处理为 intransitive :

libraryDependencies ++= Seq(
"org.some.id" % "some-lib" % "1.0.foobar" intransitive()
)

会将 some-lib 添加到依赖项中,但不会遵循该 lib 的依赖项。所以如果 some-lib依赖于 some-other-lib不会下载其他库。

也许更具体一点。比如说,你需要几个库都使用 SLF4J 作为日志接口(interface)。也许,一些库需要稍微不同的版本,但没有任何 API 差异。所以他们都可以使用相同的 SLF4J 版本。然后,您会将所有这些 libraryDependencies 标记为不及物,并将 SLF4J 本身添加一次作为顶级库依赖项。
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-api" % 1.7.6,
"com.typesage.slick" %% "slick" % "2.0.0" intransitive(),
"com.typesafe.akka" %% "akka-slf4j" % "2.2.0" intransitive()
)

我说得有道理吗?

关于scala - 如何使用 SBT 帮助我的库解决传递依赖冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com