/ / SBTマルチプロジェクトビルドがある場合、Aのテスト依存関係がBのテストに漏れないようにするにはどうすればよいですか?scala、testing、dependencies、sbt

SBTマルチプロジェクトビルドがある場合、Aのテストの依存関係をBのテストにリークしないようにするにはどうすればよいですか-scala、テスト、依存関係、sbt

したがって、モジュール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

これがビルドエラーです。ビルドでscalaz7.2をプルしていることがわかりますが、scalaz7.1.6のみをプルしているはずです。

回答:

回答№1は0

問題は間違いなくお互いに依存しているプロジェクトではありません、構成 "compile->compile;test->compile"、私には思えますが、達成する必要のあることには完全に有効です。

問題の原因は、 libraryDependencies AがBに依存しているため、共有されます。幸い、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() コンビネータ。クラスパスのクラスに互換性がないために、実行時に失敗しないようにする方法はわかりません。


回答№2の場合は0

この号で指定した内容は、期待どおりに機能します。

問題は、ビルドファイルに、先ほど説明したばかりの無関係な依存関係があることでした。その依存関係により、doobie 3.0が引き込まれ、doobie2.3しか期待していませんでした。