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