2014-10-03 11 views
6

SBT verwenden, würde Ich mag den folgenden SBT Build-Setup haben:Wie für interdependent Projekte in verschiedenen Konfigurationen

object MyBuild extends Build { 

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

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

Wenn core das Hauptmodul, einschließlich Domänenobjekte und testkit ist ein Modul zum Testen Unterstützung Code (Builder, Matcher, Testtreiber, etc; nicht die Tests selbst), die von den Domänenobjekten und anderen Klassen/utils in core abhängt.

Für diese Einrichtung gibt SBT einen Cyclic reference Fehler, obwohl es wegen der Verwendung von unterschiedlichen Konfigurationen (core kompiliert, dann kompiliert testkit auf core abhängig, dann coretest wird in Abhängigkeit von sowohl kompiliert) nicht wirklich eine zyklische Abhängigkeit ist.

fand ich eine schmutzige Art und Weise, um dieses Problem zu erhalten, indem eine der dependsOn Verwendung unmanagedClasspath, zum Beispiel zu ersetzen:

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

Das fühlt sich an wie ein Hack, und macht auch sbt-idea falsche IntelliJ Projekte generieren (unter anderem Dinge).

Irgendeine Idee für eine bessere Lösung? Unterstützt SBT eine solche Struktur?

Antwort

2

Sbt prüft nur Projekte, wenn zyklische Abhängigkeiten gesucht werden. Es berücksichtigt keine Konfigurationen. Die Abhängigkeitsprüfung wird an mehreren Stellen ausgeführt. Einer der wichtigsten ist der Konstruktor LoadedBuild.

Es würde Änderungen an einigen Stellen und wahrscheinlich einige umfangreiche Tests erfordern. Wenn Sie dieses Feature wirklich wollen, könnte es theoretisch hinzugefügt werden.

Die nächstgelegene Sie die Art und Weise sbt selbst erhalten können fügt die Abhängigkeit:

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") 
) 
Verwandte Themen