So erstellen Sie eine Play 2.2 Scala-Anwendung als SBT-Unterprojekt
Ich versuche, eine Scala-Anwendung zu erstellen, die aus einem Bibliotheksprojekt besteht (nennen wir diescommon
), ein Thrift-Server-Projekt (nennen wir diesserver
) und ein Play - Webanwendungsprojekt (im Folgenden alsweb
). Alle drei sind in Scala geschrieben und mit sbt gebaut.
Meine Projektstruktur sieht so aus:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
Meinebuild.sbt
Datei (etwas vereinfacht) sieht so aus:
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)
Das Problem dabei ist, dass das Root-Projekt kein Play-Projekt istplay
Befehl funktioniert nicht (es kommt zu Fehlern mit
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
Ich kann dies beheben, indem ich das Root-Projekt wie ein Play-Projekt aussehen lasse, wenn ich die Zeile einfügeplayScalaSettings
nach demversion
Zeile in der SBT-Datei, aber dann habe ich ein anderes Problem: dieplay run
Befehl versucht, das Stammprojekt auszuführen, nicht dasweb
Teilprojekt. Offensichtlich dieplay run
Befehl funktioniert nicht, wenn er in der ausgeführt wirdweb
Unterverzeichnis, da dort keine SBT-Datei zur Beschreibung des Projekts und seiner Abhängigkeiten vorhanden ist.
Ich suche nach einer Lösung, die es mir ermöglicht, diese Projektstruktur beizubehalten (dh das Play-Projekt ist eines von vielen Unterprojekten in meiner Anwendung) und gleichzeitig die gesamte Aktualität des Play-Frameworks beizubehalten, z mögencommon
).
Ich dachte, ich hätte die Lösung durch Laufen gefundenplay
um die interaktive Konsole zu erhalten, und dann
project web
run
Das funktioniert, aber es funktioniert nicht in der Befehlszeile.play web/run
Aus irgendeinem Grund wird die Root-Ebene ausgeführtrun
Befehl, der, wie oben erwähnt, nicht funktioniert, da die Root-Anwendung keine Play-Anwendung ist.
Hinweis: Eine ähnliche Frage wurde zuvor im Zusammenhang mit Play 2.0 unter gestelltSpielen Sie das Framework als SBT-Nicht-Root-Modul, aber die Antwort ist nicht zufriedenstellend, und ich glaube, dass sie ab Play 2.2 noch korrekt ist.