如何创建一个Play 2.2 Scala应用程序作为SBT子项目

ane*_*son 23 sbt playframework

我正在尝试创建一个Scala应用程序,包括一个库项目(让我们称之为common),一个Thrift服务器项目(让我们称之为server)和一个Play Web应用程序项目(以下称为web).这三个都是用Scala编写的,并用sbt构建.

我的项目结构如下所示:

myproject/
-common/
  ...
-server/
  ...
-web/
  -app/
  -conf/
  ...
-project/
  -Build.scala
  -build.properties
-build.sbt
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

这个问题是根项目不是Play项目,所以play命令不起作用(它出错了

java.lang.RuntimeException: */*:playRunHooks is undefined.
at scala.sys.package$.error(package.scala:27)
Run Code Online (Sandbox Code Playgroud)

如果我在SBT文件中的行playScalaSettings之后插入行,我可以通过使根项目看起来像Play项目来解决这个version问题,但是我有另一个问题:该play run命令尝试运行根项目,而不是web子项目.显然,该play run命令在web子目录中运行时不起作用,因为那里没有SBT文件来描述项目及其依赖项.

我正在寻找一种解决方案,允许我保留这个项目结构(意味着Play项目是我的应用程序中的许多子项目之一),同时保留所有Play框架热点,如代码更改时的热更新(甚至依赖库中的代码)喜欢common).

我以为我通过运行play获得交互式控制台找到了解决方案,然后

 project web
 run
Run Code Online (Sandbox Code Playgroud)

这可行,但它在命令行上不起作用. play web/run由于某种原因运行根级别run命令,如上所述,该命令不起作用,因为根应用程序不是Play应用程序.

注意:之前在Play Framework中将 Play 2.0 作为SBT非根模块提出了类似的问题,但答案并不令人满意,我认为从Play 2.2开始,它仍然没有问题.

Seb*_*ber 14

如果

 play (entering shell)
 project web
 run
Run Code Online (Sandbox Code Playgroud)

工作,然后你可以从命令行使它工作:

 play "project web" "run"
Run Code Online (Sandbox Code Playgroud)

您可以在命令行中执行shell中的任何操作.

我有相同的项目结构,这是我的工作方式.

顺便说一句,我不认为热重载的东西与Play有关.它是由SBT提供的增量编译,由Play使用.我认为play命令只是一些被攻击的SBT发射器.

以下命令对我来说很好:

 sbt "project web" "run"
Run Code Online (Sandbox Code Playgroud)

它通过热重载启动Play项目.


我想你甚至可以使用

 sbt "project web" "~run"
Run Code Online (Sandbox Code Playgroud)

每次更改源文件时都会尝试重新编译,而不是等待浏览器刷新,并且会赢得一些时间.