我正在尝试创建一个Scala应用程序,该应用程序由一个库项目(我们称之为common
),一个Thrift服务器项目(我们称之为server
)和一个Play网络应用程序项目(以下称为web
)组成。这三个都是用Scala编写的,并使用sbt构建。
我的项目结构如下所示:
myproject/
-common/
...
-server/
...
-web/
-app/
-conf/
...
-project/
-Build.scala
-build.properties
-build.sbt
我的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项目,因此该play
命令不起作用(错误提示为
java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
如果我在SBT文件中的该行playScalaSettings
之后插入该行,则可以通过使根项目看起来像Play项目来解决此version
问题,但是我还有另一个问题:该play run
命令尝试运行根项目,而不是web
子项目。显然,该play run
命令在web
子目录中运行时不起作用,因为那里没有描述项目及其依赖项的SBT文件。
我正在寻找一种解决方案,使我可以保留此项目结构(这意味着Play项目是我的应用程序中许多子项目之一),同时保留所有Play框架的热度,例如在代码更改(甚至相关库中的代码)时进行热更新。像common
)。
我以为我找到了解决方案,方法是运行play
以获取交互式控制台,然后
project web
run
可以,但是在命令行上不起作用。play web/run
由于某种原因,运行根级别run
命令,如上所述,该命令不起作用,因为根应用程序不是Play应用程序。
注意:以前在Play Framework的Play 2.0上下文中曾问过一个类似的问题,即SBT非根模块,但答案并不令人满意,我也不认为从Play 2.2开始它还是正确的。
如果
play (entering shell)
project web
run
起作用,那么您可以从命令行使其起作用:
play "project web" "run"
您可以在命令行中执行任何操作,而在Shell中则可以执行任何操作。
我具有相同的项目结构,这对我来说是一种行之有效的方法。
顺便说一句,我不认为热门游戏与Play有关。它是Play使用的SBT提供的增量编译。我认为play命令只是一些被黑的SBT启动器。
以下命令对我来说很好用:
sbt "project web" "run"
并通过热重装启动Play项目。
我想你甚至可以使用
sbt "project web" "~run"
每当您更改源文件时,它将尝试重新编译,而不是等待浏览器刷新,这将使您赢得一些时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句