Playframework 如何将Play 2.2 Scala应用程序创建为SBT子项目
我正在尝试创建一个Scala应用程序,它由一个库项目(我们称之为Playframework 如何将Play 2.2 Scala应用程序创建为SBT子项目,playframework,sbt,Playframework,Sbt,我正在尝试创建一个Scala应用程序,它由一个库项目(我们称之为common)、一个Thrift服务器项目(我们称之为server)和一个Play web应用程序项目(以下称为web)组成。这三种语言都是用Scala编写的,并使用sbt构建 我的项目结构如下所示: myproject/ -common/ ... -server/ ... -web/ -app/ -conf/ ... -project/ -Build.scala -build.properties -b
common
)、一个Thrift服务器项目(我们称之为server
)和一个Play web应用程序项目(以下称为web
)组成。这三种语言都是用Scala编写的,并使用sbt构建
我的项目结构如下所示:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
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)
我的build.sbt
文件(简化了一点)如下所示:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
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)
问题是根项目不是播放项目,因此Play
命令不起作用(它会出错)
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
如果我在SBT文件的版本
行之后插入行playscalettings
,我可以通过使根项目看起来像一个播放项目来解决这个问题,但是我还有另一个问题:Play run
命令试图运行根项目,而不是web
子项目。显然Play run
在web
子目录中运行时,命令不起作用,因为那里没有描述项目及其依赖关系的SBT文件
我正在寻找一种解决方案,它允许我保留此项目结构(意味着Play项目是我的应用程序中许多子项目之一),同时保留所有Play框架的热度,如代码更改时的热更新(甚至是依赖库中的代码,如common
)
我想我通过运行play
来获得交互式控制台,然后
project web
run
这是可行的,但在命令行上不起作用。playweb/run
出于某种原因运行根级别的run
命令,如上所述,该命令不起作用,因为根应用程序不是play应用程序
注:之前在播放2.0时曾提出过类似的问题,但答案并不令人满意,我也不认为它在播放2.2时仍然正确。如果
play (entering shell)
project web
run
工作,然后可以通过命令行使其工作:
play "project web" "run"
您可以在命令行中执行shell中可以执行的任何操作
我有相同的项目结构,这是一种对我来说很好的方法
顺便说一句,我不认为热重新加载与播放有关。它是由播放使用的SBT提供的增量编译。我认为播放命令只是一些被黑客攻击的SBT启动器
以下命令对我来说很好:
sbt "project web" "run"
它通过热重新加载启动Play项目
我想你甚至可以使用
sbt "project web" "~run"
它将在每次更改源文件时尝试重新编译,而不是等待浏览器刷新,并将使win有一段时间。我认为这是Play 2.2中的一个错误,因此我将其报告为。 此外,它似乎已在2.3.x中修复,因此可能不会在2.2中修复。我提出了一个有点古怪的解决方法:
lazy val root=(文件中的项目(“.”)。
背景(
playRunHooks:=零,
playInteractionMode:=play.PlayConsoleInteractionMode,
playDefaultPort:=9000,
播放监视器文件:=(Def.taskDyn){
val s=状态值
s、 history.current.split(“/”).headOption匹配{
案例部分(参考)=>
定义任务{
(本地项目中的PlayMonitoredFile(参考)).value
}
案例=>
定义任务{
playMonitoredFiles.value
}
}
}).价值
)