簡體   English   中英

如果我有一個SBT多項目構建,如何使A的測試依賴項不泄漏到B的測試中

[英]If I have an SBT multi-project build, how can I make A's test dependencies not leak in to B's tests

因此,我有一個包含模塊A和B的SBT項目。

  • A取決於B。
  • A和B的常規項目包是兼容的。
  • A的測試包與B的測試包不兼容。
  • A不依賴於B的測試包
  • A的測試失敗,因為測試包不兼容

在我看來,這種失敗是無效的,因為A的測試不依賴於B的測試。

我正在使用

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

含義

  • A的編譯取決於B的編譯
  • A的測試取決於B的編譯。

難道我做錯了什么?

這是實際的構建文件 相關項目是doobieSupport23取決於core

這是構建錯誤 您可以看到它在構建中加入了scalaz 7.2,但是應該只在拉入scalaz 7.1.6。

問題絕對不是在彼此依賴的項目中,在我看來,配置"compile->compile;test->compile"對於您需要實現的目標是完全有效的。

造成此問題的原因是,由於A依賴於B而共享了libraryDependencies 。幸運的是,sbt可以非常精確地管理依賴關系。

最簡單的建議是將沖突依賴的更新版本應用到盡可能小的范圍內-這意味着,如果僅在核心測試中需要scalaz 7.2.0,那就這樣吧!

lazy val core = project(...)
  .settings(libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.2.0")
lazy val doobieSupport23 = project(...).dependsOn(core)
  .settings(libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.1.6")

如果由於較新版本實際上已在其他內核的依賴項中使用而使它無法工作,則可以使用以下技巧:

val scalazOld = "org.scalaz" %% "scalaz" % "7.1.6"
val scalazNew = "org.scalaz" %% "scalaz" % "7.2.0"

lazy val core = project(...)
  .settings(libraryDependencies += "org.scalaz" %% "scalaz" % "7.2.0")

lazy val doobieSupport23 = project(...).dependsOn(core)
  .settings(
    libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.1.6" force()
  )

注意force()組合器。 我不確定以這種方式它不會在運行時因類路徑中的類不兼容而失敗。

我在問題中指定的內容完全符合預期。

問題最終是我的構建文件有一個剛剛掩蓋的無關項。 這種依賴性導致doobie 3.0被拉到我只期望doobie 2.3的位置。

暫無
暫無

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

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