2

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

Core - 包含核心路由、控制器、助手、核心静态资源和视图的单个共享项目

模板- 少数包含模板特定路由、控制器、静态资源和视图的模板项目

站点- 大量包含 css (scss) 和配置的站点

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

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

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

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

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

我在做什么感觉很不对劲,还有其他人以更好的方式实现了类似的项目结构吗?

4

1 回答 1

1

我确实必须构建一个多项目 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>命令将切换到所需的项目。

于 2013-07-12T14:53:12.757 回答