2013-02-01 18 views
5

Per impostazione predefinita, SBT compila la sorgente sotto src/main e src/tests a target/scala-[version]/classes e target/scala-[version]/test-classes, rispettivamente. Mi piacerebbe definire un altro gruppo chiamato core che posso inserire in src/core/java o src/core/scala e averlo compilato in un percorso di classe separato. Come faccio a fare questo?Come definire un altro ambito di compilazione in SBT?

Il mio motivo: voglio avere gruppi separati di file di classe, perché voglio ricompilare e ricaricare il nuovo codice dell'applicazione durante lo sviluppo, senza riavviare il processo JVM per l'applicazione in esecuzione. Quindi le classi core si caricheranno all'avvio dell'applicazione e useranno un classloader personalizzato per caricare tutto il resto da src/main. Queste ultime classi saranno ricaricabili. Devo farlo perché sto scrivendo un programma musicale che carica uno strumento software tramite JNI, che richiede molto tempo per essere caricato. Riavviare l'app durante lo sviluppo fa perdere troppo tempo.

Ho principalmente bisogno di separare i file di classe. Se stavo producendo vasi, vorrei myapp-core.jar e myapp-main.jar, ma non è così importante, poiché questo è per lo sviluppo più del prodotto finale.

Un primo tentativo:

val Core = config("core") 
... 
classDirectory in Core <<= crossTarget(t => file(t.getAbsolutePath + "core-classes")) 

dà questo errore:

Reference to undefined setting: 
{.}/*:cross-target from {.}/core:class-directory 
    Did you mean *:cross-target ? 

andrò leggere sugli ambiti ora ...

risposta

5

C'è un advanced configurations example nella documentazione che sbt mostra molti aspetti delle configurazioni di compilazione personalizzate.

Un semplice esempio è:

object MyBuild extends Build { 

    lazy val root = Project(..., 
    settings = Defaults.defaultSettings ++ coreSettings 
) 

    // Declare the custom configuration. 
    lazy val Core = config("core") 

    lazy val coreSettings: Seq[Setting[_]] = 
    // Add the src/core/scala/ compilation configuration. 
    // This configures sources, classpaths, output directories, REPL, scalac, ... 
    inConfig(Core)(Defaults.configSettings) ++ Seq(
     // example dependency just for Core 
     libraryDependencies += "org.example" % "demo" % "1.0" % Core, 
     // register the custom core configuration 
     ivyConfigurations += Core 
    ) 
} 

accesso classpath nucleo compilato con il compito fullClasspath in Core.

+0

Se l'esempio è più coinvolto di quanto necessario o compreso, cosa si intende fare specificamente con la configurazione aggiuntiva? Pubblicalo, includilo nel barattolo principale, ...? –

+0

Non capisco ancora quell'esempio. Ho aggiunto alla domanda per spiegare cosa voglio fare con la configurazione aggiuntiva. –

+0

Funziona alla grande, ma come si rende disponibile la configurazione del Core alla configurazione di Test? – Brendanator

Problemi correlati