簡體   English   中英

如何使用SBT幫助我的圖書館解決傳遞依賴沖突

[英]How can I use SBT to help my library get around transitive dependency conflicts

假設我正在編寫一個Scala庫L,它依賴於一些依賴關系D並被程序P和另一個程序Q消耗.P直接依賴於版本3.2,而Q直接依賴於版本3.3。

在這兩個版本之間,D的API被洗牌,以便獲得我在L中使用的相同功能,我必須在L中編寫不同的import語句。同樣,P依賴於3.2特定的行為,而Q依賴於3.3特定的行為。

現在,通常情況下會在編譯P和Q時選擇最新版本的D,但如果L取決於庫的3.3版本,則會導致P中斷,或者如果L依賴於L則編譯Q時會導致L中斷在D版本3.2

理想情況下,我喜歡P和Q使用相同版本的L,因為L's公共API不會改變。 這可能嗎?

想到的一般方法是基於依賴性解析的L的條件編譯。 這在JVM世界中似乎無法實現,因為我們不會傳遞地編譯項目的依賴項,而是依賴於預編譯的工件。

如果D是Scala本身(即使用不同的Scala版本進行交叉編譯並且在其自己的目錄中存在特定於版本的代碼),我現在可以使用SBT執行此操作,但是從自從SBT更改以來依賴性解析的角度來看這是一種破解允許此交叉編譯工作的工件的名稱。

您可以告訴sbt將依賴關系視為intransitive

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

會為依賴項添加一些lib,但不會遵循該lib的依賴項。 因此,如果some-libsome-other-lib some-lib具有依賴性,則不會下載其他lib。

也許更具體一點。 比如,您需要使用SLF4J作為日志記錄界面的多個庫。 也許,某些庫需要稍微不同的版本,但沒有任何API差異。 所以他們都可以使用相同的SLF4J版本。 然后,您將所有這些庫依賴項標記為不及物,並將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()
)

我有道理嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM