6

次の SBT ビルド セットアップが必要です。

object MyBuild extends Build {

  lazy val core = Project("core", file("core"))
    .dependsOn(testkit % "test")

  lazy val testkit = Project("testkit", file("testkit"))
    .dependsOn(core % "compile")
}

coreドメイン オブジェクトを含むメイン モジュールでありtestkitドメインオブジェクトや.core

このセットアップでは、SBT はエラーを返しますが、実際には異なる構成 (をコンパイルし、次に に依存してコンパイルし、次に両方に依存してコンパイルCyclic referenceする) を使用しているため、循環的な依存関係はありません。coretestkitcorecore test

dependsOnuseの 1 つを置き換えることで、この問題を回避する汚い方法を見つけましたunmanagedClasspath。たとえば、次のようになります。

.settings(unmanagedClasspath in Compile <+= (packageBin in (LocalProject("core"), Compile)))

これはハックのように感じられ、sbt-idea(とりわけ) 不適切な IntelliJ プロジェクトが生成されます。

より良い解決策のアイデアはありますか? SBT はそのような構造をサポートしていますか?

4

1 に答える 1

2

Sbt は、循環依存関係を探すときにのみプロジェクトをチェックします。構成は考慮されません。依存関係チェックは複数の場所で実行されます。最も重要なものの 1 つは、 のコンストラクタにありLoadedBuildます。

いくつかの場所での変更と、おそらくいくつかの広範なテストが必要になります。この機能が本当に必要な場合は、理論的には追加できると思います。

sbt 自体が依存関係を追加する方法に最も近いもの:

lazy val core = project.in( file("core") )
  .settings(
    internalDependencyClasspath in Test <++= 
      exportedProducts in Compile in LocalProject("testkit")
  )

lazy val testkit = project.in( file("testkit") )
  .settings(
    internalDependencyClasspath in Compile <++= 
      exportedProducts in Compile in LocalProject("core")
)
于 2014-10-25T13:31:11.633 に答える