2013-02-01 14 views
5

Domyślnie SBT kompiluje źródła pod numerami src/main i src/tests na target/scala-[version]/classes i target/scala-[version]/test-classes. Chciałbym zdefiniować inną grupę o nazwie rdzeń, którą mogę umieścić w src/core/java lub src/core/scala i skompilowałem ją do oddzielnej ścieżki klasy. Jak mam to zrobic?Jak zdefiniować inny zakres kompilacji w SBT?

Moja motywacja: Chcę mieć oddzielne grupy plików klas, ponieważ chcę rekompilować i ponownie ładować nowy kod aplikacji podczas programowania bez restartowania procesu JVM dla uruchomionej aplikacji. Klasy podstawowe zostaną załadowane po uruchomieniu aplikacji i będą używać niestandardowego programu ładującego klasy, aby załadować wszystko inne z src/main. Te ostatnie klasy będą doładowywane. Muszę to zrobić, ponieważ piszę program muzyczny, który ładuje instrument przez JNI, który ładuje się długo. Ponowne uruchomienie aplikacji podczas projektowania marnuje zbyt dużo czasu.

Głównie trzeba oddzielić pliki klas. Gdybym produkowała słoiki, potrzebowałbym plików myapp-core.jar i myapp-main.jar, ale to nie jest tak ważne, ponieważ jest to coś więcej niż tylko produkt końcowy.

Pierwsza próba:

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

daje ten błąd:

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

pójdę poczytać o teleskopach teraz ...

Odpowiedz

5

Jest advanced configurations example w dokumentacji, że SBT pokazuje wiele aspektów niestandardowych konfiguracji kompilacji.

Podstawowy przykład jest:

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 
    ) 
} 

dostępu skompilowany rdzeń ścieżka klasy poprzez zadanie fullClasspath in Core.

+0

Jeśli przykład jest bardziej zaangażowany niż potrzebujesz lub rozumiesz, co konkretnie chcesz zrobić z dodatkową konfiguracją? Opublikuj go, umieść w głównym słoiku, ...? –

+0

Nie rozumiem jeszcze tego przykładu. Dodałem do tego pytania, aby wyjaśnić, co chcę zrobić z dodatkową konfiguracją. –

+0

Działa to świetnie, ale w jaki sposób udostępniasz konfigurację Core do konfiguracji testu? – Brendanator

Powiązane problemy