我确实必须构建一个多项目 Play 应用程序结构,这就是我们最终要做的。
Scala 构建工具
Play 项目或模块基本上是sbt 项目,sbt 不允许从父目录导入模块。如果要导入项目,则需要可从项目的根目录访问它。将符号链接添加到父目录可以解决问题,但它是某种猴子补丁。
相反,您可以完全使用 sbt 并从主项目定义项目层次结构和依赖关系。
超级工程
您在问题中建议的层次结构似乎很自然而且很好,需要做的是定义一个将监督所有模块和项目的项目。它将是应用程序的唯一入口点。
所以这个超级模块的文件系统应该是这样的:
/core
/templates
/template1
/template2
...
/sites
/site1
/site2
...
/project --> Normal Play config files
Build.scala
build.properties
plugins.sbt
/conf
application.conf --> emtpy file so Play recognises it as a project.
这里的关键是在Build.scala
. 根据您的项目,它可能如下所示:
import sbt._
import Keys._
import play.Project._
object ApplicationBuild extends Build {
val commonDependencies = Seq( javaCore, javaJdbc, javaEbean )
val coreDeps = commonDependencies
val core = play.Project("core", "1.0.0", coreDeps, path=file("core"))
val template1Dependencies = comonDependencies
// Define the template, note that the dependsOn() adds local dependencies
// and the aggregate() asks to first compile the dependencies when building
// this project.
val template1 = play.Project("template1", "1.0.0", template1Dependencies,
path=file("templates/template1")).dependsOn(core)
.aggregate(core)
val site1Deps = commonDependencies
val site1 = play.Project("site1", "1.0.0", site1Deps,
path=file("sites/site1")).dependsOn(core, template1)
.aggregate(core, template1)
val main = play.Project("master-project", appVersion)
}
另请注意,您的任何子模块都不需要/project
目录,因为所有内容都在主Build.scala
文件中定义。只有conf/application.conf
每个子项目都需要。
然后你需要做的就是从主目录加载 play 并从 sbt 提示符中选择项目:
[master-project]> project site1
[site1]> compile
[site1]> run
该projects
命令将列出您在Build.scala
文件中定义的所有项目,并且该project <project name>
命令将切换到所需的项目。