构建多个Play Framework(2.1)项目以进行继承

时间:2012-12-03 23:07:28

标签: playframework-2.1

我希望使用Play创建一些网站,但希望以某种方式构建它,以便可以共享大多数代码和路由。我已经看到很多依赖于其他项目的项目示例,并发现2.1版本的候选版本允许导入路由,但是仍然不知道如何设置项目。我想要实现的层看起来像这样:

核心 - 包含核心路由,控制器,帮助程序,核心静态资源和视图的单个共享项目

模板 - 少数模板项目,其中包含特定于模板的路径,控制器,静态资源和视图

网站 - 大量网站主要包含css(scss)和配置

单个正在运行的应用程序将包含一个构建于核心之上的单个模板项目之上的站点构建。

这样做的想法是能够跨站点共享尽可能多的代码,并能够快速构建它们(假设有一个模板项目已经适合模板存储库中的账单)。

我原来的想法是有一个看起来像这样的结构:

->core
->templates
       ->template1Project
       ->template2Project
->sites
       ->site1project
       ->site2project
       .
       .

然后我在每个指向模板和核心的站点下的modules目录中创建一个符号链接,这样我就可以在每个站点中将这些作为PlayProject依赖项,但仍然只维护每个站点中的一个。

我在做什么感觉非常错误,还有其他人以更好的方式实现了类似的项目结构吗?

1 个答案:

答案 0 :(得分:1)

我确实需要构建一个多项目Play应用程序结构,这就是我们最终要做的事情。

Scala构建工具

播放项目或模块基本上是sbt projects,而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

然后您需要做的就是从主目录加载游戏并从sbt提示符中选择项目:

[master-project]> project site1
[site1]> compile
[site1]> run

projects命令将列出您在Build.scala文件中定义的所有项目,project <project name>命令将切换到所需项目。