PlayFramework多项目中的自定义模板

时间:2017-07-24 17:04:52

标签: scala templates playframework multi-module

我有一个带有播放模块和其他scala模块的多模块播放应用程序,每件事都运行正常。我想添加一个自定义的Twirl模板,那就是出现问题的时候。这是Multiproject structure

build.sbt:

name := """scalaplay"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala).dependsOn(restfulapi,util).aggregate(restfulapi,util)
scalaVersion := "2.11.7"

/**
  * .dependsOn(util). will let us use element from dbmodule into apirestmodule. Specifically some element and structure
  * of the data model.
  *
  */

lazy val restfulapi = (project in file("modules/apirest")).enablePlugins(PlayScala).dependsOn(util).settings(scalaVersion:="2.11.7",
  libraryDependencies ++= Seq(
    cache,
    "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test
  )
)

lazy val util = (project in file("modules/dbmodule")).settings(scalaVersion:="2.11.7")

TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat")

apirest.routes的一部分:

    #processing premierLeague
    POST     /premier/match             controllers.PremierleagueController.insertMatch

    GET      /premier/matchs            controllers.PremierleagueController.getMatchGame

    GET     /assets/*file            controllers.Assets.versioned(path="/public", file: Asset)

    GET     /records                    controllers.HomeController.records

使用该模板的操作位于HomeController.scala:

......

 def records = Action {
    Ok(views.csv.records(Record.sampleRecords))
  }

.....

这是我展示我的来源时的结果:

[scalaplay] $ show twirlCompileTemplates::sourceDirectories
[info] restfulapi/compile:twirlCompileTemplates::sourceDirectories
[info]  List(/Users/ldipotet/scala/scalaplay/modules/apirest/app)
[info] root/compile:twirlCompileTemplates::sourceDirectories
[info]  List(/Users/ldipotet/scala/scalaplay/app)

当我尝试编译项目时,这是我的编译错误:

[info] Compiling 22 Scala sources and 1 Java source to /Users/ldipotet/scala/scalaplay/modules/apirest/target/scala-2.11/classes...
[error] /Users/ldipotet/scala/scalaplay/modules/apirest/app/controllers/HomeController.scala:72: object csv is not a member of package views
[error]     Ok(views.csv.records(Record.sampleRecords))
[error]              ^
[error] one error found
[error] (restfulapi/compile:compileIncremental) Compilation failed
[error] Total time: 6 s, completed 24-jul-2017 17:18:11

有关更多信息,相同的自定义模板可在单个playframework项目中编译和工作

2 个答案:

答案 0 :(得分:0)

问题是对自定义格式文件的引用:

TwirlKeys.templateFormats + =(" csv" - >" views.CsvFormat")

它位于多项目根目录下的唯一built.sbt文件中。

-rw-r--r--   1 ldipotet  staff     695 27 jul 01:23 build.sbt
drwxr-xr-x   5 ldipotet  staff     170 27 jul 01:16 conf
-rw-r--r--   1 ldipotet  staff  895312 18 jul 10:44 football.txt
drwxr-xr-x   3 ldipotet  staff     102 27 jul 01:43 logs
drwxr-xr-x   5 ldipotet  staff     170 12 jul 12:28 modules
-rw-r--r--   1 ldipotet  staff     191 20 jul 13:36 package.txt
drwxr-xr-x   6 ldipotet  staff     204 27 jul 01:16 project
drwxr-xr-x   5 ldipotet  staff     170  1 jun 12:24 public
-rw-r--r--   1 ldipotet  staff  175256 12 jul 16:54 regex.png
drwxr-xr-x  11 ldipotet  staff     374 27 jul 01:43 target
drwxr-xr-x   4 ldipotet  staff     136  5 jul 09:22 test

这是错误的,因为编译器试图在模板所在的项目中查找格式。我的意思是项目本身(basedir / modules / api rest)模板的位置,并没有任何参考。

解决方案:在子项目 basedir / modules / apirest 中创建build.sbt ,创建自定义模板的位置:

BASEDIR /模块/ apirest / built.sbt

name := """apirest"""

TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat")

当然从root的built.sbt中删除 TwirlKeys.templateFormats + =(" csv" - >" views.CsvFormat")项目

无论是单项还是多项目,都必须将引用放在自定义模板所在的项目中。

答案 1 :(得分:0)

@ldipotet给出的Answen实际上解决了这个问题,但还有其他方法。

1 只需移动主TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat")restfulapi定义内的build.sbt,如下所示:

...
lazy val restfulapi = (project in file("modules/apirest")).enablePlugins(PlayScala).dependsOn(util).settings(scalaVersion:="2.11.7",
  libraryDependencies ++= Seq(
    cache,
    "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test
  ),
  TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat")
)
...

2 如果您将需要其他子项目中的自定义格式,请将公共设置移动到Common.scala文件中的对象(在任何您想要的名称中将其命名){{ 1}}目录:

basedir/project

然后在子项目import sbt._ object Common { val settings: Seq[Setting[_]] = Seq( TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat") ) } 中使用Common对象:

build.sbt

有关详细信息,请参阅子项目的PlaySBT文档。