2014-10-03 31 views
6

Mi piacerebbe avere la seguente configurazione SBT costruzione:Come usare SBT per progetti interdipendenti in diverse configurazioni

object MyBuild extends Build { 

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

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

Quando core è il modulo principale, tra cui oggetti di dominio, e testkit è un modulo per il supporto di test codice (builder, matcher, driver di test, ecc .; non i test stessi) che dipende dagli oggetti dominio e altre classi/utilità in core.

Per questa configurazione SBT dà un errore Cyclic reference, anche se non c'è davvero una dipendenza ciclica causa dell'utilizzo di differenti configurazioni (core compilazioni, quindi testkit compila seconda core, quindi coretest viene compilato in relazione ai differenti).

Ho trovato un modo sporco per aggirare questo problema sostituendo uno dei dependsOn uso unmanagedClasspath, ad esempio:

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

Questo si sente come un hack, e rende anche sbt-idea generare progetti IntelliJ non corretti (tra l'altro cose).

Qualche idea per una soluzione migliore? SBT supporta questa struttura?

risposta

2

Sbt controlla solo i progetti quando cerca le dipendenze cicliche. Non tiene conto delle configurazioni. Il controllo delle dipendenze viene eseguito in più punti. Uno dei più importanti è nel costruttore di LoadedBuild.

Richiedere modifiche in alcuni punti e probabilmente alcuni test approfonditi. Se vuoi veramente questa funzione, penso che potrebbe teoricamente essere aggiunta.

Il più vicino si può arrivare al modo in cui SBT si aggiunge la dipendenza:

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") 
) 
Problemi correlati