我有一个带有播放模块和其他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项目中编译和工作
答案 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