[英]non-Play Sbt Scala sub-project not found in root folder of Play 2.6.3 project
[英]How to create a Play 2.2 Scala application as an SBT sub-project
我正在尝试创建一个Scala应用程序,包括一个库项目(让我们称之为common
),一个Thrift服务器项目(让我们称之为server
)和一个Play Web应用程序项目(以下称为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文件中的version
行之后插入playScalaSettings
行,我可以通过使根项目看起来像Play项目来解决这个问题,但是我有另一个问题: play run
命令尝试运行根项目,而不是web
子项目。 显然,当在web
子目录中运行时, play run
命令不起作用,因为那里没有SBT文件来描述项目及其依赖项。
我正在寻找一种解决方案,允许我保留这个项目结构(意味着Play项目是我的应用程序中的许多子项目之一),同时保留所有Play框架热点,如代码更改时的热更新(甚至依赖库中的代码)像common
)。
我以为我通过运行play
找到解决方案来获取交互式控制台,然后
project web
run
这可行,但它在命令行上不起作用。 play web/run
由于某种原因运行root level run
命令,如上所述,由于根应用程序不是Play应用程序,因此无效。
注意:之前在Play Framework中将 Play 2.0 作为SBT非根模块提出了类似的问题,但答案并不令人满意,我认为从Play 2.2开始,它仍然没有问题。
如果
play (entering shell)
project web
run
工作,然后您可以从命令行使其工作:
play "project web" "run"
您可以在命令行中执行shell中的任何操作。
我有相同的项目结构,这是我的工作方式。
顺便说一句,我不认为热重载的东西与Play有关。 它是由SBT提供的增量编译,由Play使用。 我认为play命令只是一些被攻击的SBT发射器。
以下命令对我来说很好:
sbt "project web" "run"
它通过热重载启动Play项目。
我想你甚至可以使用
sbt "project web" "~run"
每次更改源文件时都会尝试重新编译,而不是等待浏览器刷新,并且会赢得一些时间。
我认为这是Play 2.2中的一个错误,因此我在运行为web / run时将其报告为错误“ / :playRunHooks未定义” 。 它似乎已在2.3.x中修复,因此很可能不会修复2.2。 我提出了一些讨厌的解决方法:
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
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.