Play框架:动态添加子项目的路线

时间:2015-06-29 16:06:08

标签: scala playframework-2.0 sbt

我正在开发一个系统来在编译时发现子项目。这有效。见here。现在唯一的问题是子项目的路径文件被忽略了。

我知道在主路由文件中包含路由文件的正常方法是将后者硬编码到前者中。但这会违反我的动态子项目的目标。

我敢打赌,在Build.scala中,有一种方法可以发现路径文件并将其附加到主路径文件中。但我是初学者,我不知道该怎么做。你能帮帮我吗?

或者,如果在编译时无法执行此操作,可能有一种方法可以在运行时加载它吗?我知道那里有api to intercept requests。因此,如果我们可以读取路由,那么我们就可以实现动态路由。这是个好主意吗?

2 个答案:

答案 0 :(得分:0)

您的子模块可以实现自己的routing DSL。请参阅api doc中的示例。 (可选)您可以在根项目中挂钩Compile任务,并以编程方式将所有路由追加到主routes文件。

答案 1 :(得分:0)

最后,我必须编写路由文件的片段(每个子项目一个,使用不同的扩展,例如subproject.routes),然后将它们连接成一个单独的路由文件。您还必须为application.conf文件执行此操作。

我是通过Build.sbt脚本完成的:

import sbt._
import Keys._
import play._
import java.io._

object Build extends Build {

  val commonSettings: Seq[Setting[_]] = Seq(
    scalaVersion := "2.11.1"
  )

  IO.copyFile(file("conf/base.routes"), file("conf/routes"))

  IO.copyFile(file("conf/base.application.conf"), file("conf/application.conf"))

  lazy val libFolder = file("base-lib");
  lazy val baseLib = processModule(libFolder)

  lazy val modules = (file("modules") * DirectoryFilter).get.map { dir =>
    processModule(dir).dependsOn(baseLib)
  }

  lazy val root = (project in file("."))
    .enablePlugins(PlayJava)
    .settings(
      name := "mainProject",
      version := "1.0"
    )
    .dependsOn(modules map (m => m: ClasspathDependency): _*)
    .aggregate(modules map (m => m: ProjectReference): _*)

  override lazy val projects = root +: modules +: dspcloudLib

  def processModule(dir: File):Project = {
    val p = Project(dir.getName, dir).enablePlugins(PlayJava).settings(commonSettings: _*)

    val mf = new File(dir, "conf/" + dir.getName + ".r")
    val r = IO.read(mf)
    IO.append(file("conf/routes"), r.toString)

    val cf = new File(dir, "conf/" + dir.getName + ".application.conf")
    val c = IO.read(cf)
    IO.append(file("conf/application.conf"), c.toString)

    p
  }
}