【问题标题】:Play framework: Add routes from sub-projects dynamically播放框架:动态添加子项目的路由
【发布时间】:2015-09-16 04:44:12
【问题描述】:
我正在开发一个在编译时发现子项目的系统。这行得通。见here。现在唯一的问题是子项目的路由文件被忽略了。
我知道在主路由文件中包含路由文件的正常方法是将后者硬编码到前者中。但这会违背我的动态子项目的目标。
我敢打赌,有一种方法可以在 Build.scala 中发现一个路由文件并将其附加到主路由文件中。但我是初学者,我不知道该怎么做。你能帮帮我吗?
或者,如果在编译时无法做到这一点,也许有办法在运行时加载它?我知道有一个api to intercept requests。因此,如果我们可以读取路由,我们就可以通过这种方式实现动态路由。这是个好主意吗?
【问题讨论】:
标签:
scala
playframework-2.0
sbt
【解决方案1】:
您的子模块可以实现自己的routing DSL。请参阅api doc 中的示例。或者,您可以挂接到根项目中的 Compile 任务,并以编程方式将所有路由附加到主 routes 文件。
【解决方案2】:
最后我不得不编写路由文件的片段(每个子项目一个,例如使用不同的扩展名,例如 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
}
}