gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:29:22 29 4
gpt4 key购买 nike

我正在尝试创建一个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行之后插入 version行,则可以通过使根项目看起来像Play项目来解决此问题,但是我还有另一个问题: play run命令尝试运行根项目,而不是 web子项目。显然,在 play run子目录中运行时 web命令不起作用,因为那里没有SBT文件来描述项目及其依赖项。

我正在寻找一种解决方案,使我可以保留此项目结构(这意味着Play项目是我的应用程序中许多子项目之一),同时保留所有Play框架的热度,例如在代码更改(甚至相关库中的代码)时进行热更新。像 common)。

我以为我找到了解决方案,方法是运行 play以获取交互式控制台,然后
 project web
run

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

注意:以前在 Play Framework as SBT Non-Root Module的Play 2.0上下文中曾提出过类似的问题,但答案并不令人满意,我也不认为从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"

每当您更改源文件时,它将尝试重新编译,而不是等待浏览器刷新,这将使您赢得一些时间。

关于playframework - 如何将Play 2.2 Scala应用程序创建为SBT子项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968952/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com