Próbuję utworzyć aplikację Scala składającą się z projektu bibliotecznego (nazwijmy to common
), projektu serwera Thrif (nazwijmy to server
) i Play projekt aplikacji internetowej (zwany dalej web
). Wszystkie trzy są napisane w Scali i zbudowane za pomocą sbt.Jak utworzyć aplikację Play 2.2 Scala jako podprojekt SBT
Moja struktura projektu wygląda następująco:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
Mój plik build.sbt
(uproszczony trochę) wygląda następująco:
import play.Project._
name := "myproject"
version := "1.0-SNAPSHOT"
lazy val common = project
lazy val web = project
.settings(playScalaSettings: _*)
.dependsOn(common)
lazy val server = project
.dependsOn(common)
lazy val root = project.in(file("."))
.aggregate(common, web, server)
Problemem jest to, że projekt korzeń nie jest grą projekt, więc komenda play
nie działa (nie jest to błędy się z
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
Mogę to naprawić, sprawiając, że projekt główny wygląda jak projekt Play, jeśli wstawię wiersz playScalaSettings
po linii version
w pliku SBT, ale wtedy mam kolejny problem: komenda play run
próbuje uruchomić projekt główny, a nie web
podprojekt. Oczywiście polecenie play run
nie działa, gdy jest uruchomione w podkatalogu web
, ponieważ nie ma tam pliku SBT opisującego projekt i jego zależności.
Szukam rozwiązania, które pozwoli mi zachować tę strukturę projektu (co oznacza, że projekt Play jest jednym z wielu podprojektów w mojej aplikacji), zachowując jednocześnie całą szatę graficzną Play, jak aktualizacje na gorąco, gdy zmiany kodu (nawet kod w bibliotekach zależnych, takich jak common
).
myślałem, znalazłem rozwiązanie, uruchamiając play
uzyskać interaktywną konsolę, a następnie
project web
run
To działa, ale nie działa w wierszu polecenia. play web/run
z jakiegoś powodu uruchamia polecenie poziomu podstawowego run
, które jak wspomniano powyżej nie działa, ponieważ aplikacja root nie jest aplikacją Play.
Uwaga: Podobna kwestia została wcześniej zadana w kontekście Play 2.0 pod numerem Play Framework as SBT Non-Root Module, ale odpowiedź nie jest satysfakcjonująca, podobnie jak w przypadku wersji 2.2.