Jak stworzyć aplikację Play 2.2 Scala jako podprojekt SBT
Próbuję utworzyć aplikację Scala składającą się z projektu biblioteki (nazwijmy tocommon
), projekt serwera Thrift (nazwijmy toserver
) oraz projekt aplikacji internetowej Play (zwanej dalejweb
). Wszystkie trzy są napisane w Scali i zbudowane z sbt.
Moja struktura projektu wygląda tak:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
Mójbuild.sbt
plik (nieco uproszczony) wygląda tak:
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)
Problem polega na tym, że projekt główny nie jest projektem Play, więcplay
polecenie nie działa (z błędem
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
Mogę to naprawić, sprawiając, że projekt roota będzie wyglądał jak projekt Play, jeśli wstawię linięplayScalaSettings
poversion
wiersz w pliku SBT, ale mam inny problem:play run
komenda próbuje uruchomić projekt root, a nieweb
podprojekt. Oczywiścieplay run
polecenie nie działa po uruchomieniu wweb
podkatalog, 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 wszystkie zalety struktury Play, takie jak aktualizacje na gorąco, gdy zmiany kodu (nawet kodu w zależnych bibliotekach) lubićcommon
).
Myślałem, że znalazłem rozwiązanie, uruchamiającplay
aby uzyskać interaktywną konsolę, a następnie
project web
run
To działa, ale nie działa w linii poleceń.play web/run
z jakiegoś powodu działa na poziomie głównymrun
polecenie, które jak wspomniano powyżej, nie działa, ponieważ aplikacja główna nie jest aplikacją Play.
Uwaga: Podobne pytanie zostało zadane wcześniej w kontekście Play 2.0 atPlay Framework jako SBT Non-Root Module, ale odpowiedź nie jest zadowalająca, ani też nie uważam, że nadal jest prawidłowa, jeśli chodzi o grę 2.2.