2013-09-23 3 views
23

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.

Odpowiedz

14

jeśli

play (entering shell) 
project web 
run 

prace, to można zrobić to praca z wiersza poleceń:

play "project web" "run" 

Można to zrobić w linii poleceń, co można zrobić w powłoce.

Mam tę samą strukturę projektu i jest to sposób, który działa dobrze dla mnie.

Nawiasem mówiąc, nie sądzę, że gorące przeładowanie jest związane z Play. Jest to przyrostowa kompilacja dostarczana przez SBT, z której korzysta Play. Komenda odtwarzania jest po prostu zhakowanym wyrzutni SBT, jak sądzę.

Poniższa komenda działa dobrze dla mnie:

sbt "project web" "run" 

i rozpoczyna projekt Odtwórz gorącą przeładować.


myślę, że można nawet użyć

sbt "project web" "~run" 

Który będzie próbował ponownie skompilować każdej zmianie pliku źródłowego, zamiast czekać na odświeżenie przeglądarki i pozwoli wygrać trochę czasu.

0

Myślę, że to błąd w Play 2.2, więc zgłosiłem to jako Error "/:playRunHooks is undefined" on running as web/run. Wygląda na to, że został naprawiony w wersji 2.3.x, więc prawdopodobnie nie zostanie naprawiony w wersji 2.2. Oto trochę zawiłe obejście, które wymyśliłem:

lazy val root = (project in file(".")). 
    settings(
    playRunHooks := Nil, 
    playInteractionMode := play.PlayConsoleInteractionMode, 
    playDefaultPort := 9000, 
    playMonitoredFiles := (Def.taskDyn { 
     val s = state.value 
     s.history.current.split("/").headOption match { 
     case Some(ref) => 
      Def.task { 
      (playMonitoredFiles in LocalProject(ref)).value 
      } 
     case _ => 
      Def.task { 
      playMonitoredFiles.value 
      } 
     } 
    }).value 
)