Playframework 如何将Play 2.2 Scala应用程序创建为SBT子项目

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

我正在尝试创建一个Scala应用程序,它由一个库项目(我们称之为
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
}
} 
}).价值
)