2017-07-24 3 views
0

J'ai une application de jeu multi-module avec un module de jeu et un autre module de scala et tout fonctionne bien. Je veux ajouter un template Twirl personnalisé et c'est là que les problèmes surviennent. Ceci est le Multiproject structureModèle personnalisé dans le multiprojet PlayFramework

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") 

Une partie de 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 

L'action qui utilisent le modèle est en HomeController.scala:

...... 

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

..... 

Ceci est le résultat lorsque je montre ma source:

[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) 

Et voici mon erreur de compilation lorsque je tente de compiler le projet:

[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 

Pour plus d'informations compiler le même modèle personnalisé et fonctionne dans un seul projet play framework

Répondre

0

Le problème était le référence au format personnalisé fichier:

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

Il était dans le seul fichier built.sbt placé à la racine du multi-projet.

-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 

Il était faux parce que le compilateur essayait de rechercher le format dans le projet où le modèle était. Je voulais dire dans le projet lui-même (basedir/modules/api rest) où était le modèle et il n'y avait aucune référence là.

Solution: Créer un build.sbt dans les sous-projets BASEDIR/modules/apirest , où le modèle personnalisé est créé:

basedir/modules/apirest/built.sbt

name := """apirest""" 

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

Et bien sûr supprimer TwirlKeys.templateFormats + = ("csv" -> "views.CsvFormat") à partir du built.sbt au projet racine.

Qu'il s'agisse d'un seul ou d'un multiprojet, la référence doit être placée dans le projet où se trouve le modèle personnalisé.

0

Answen donné par @ldipotet résout réellement le problème, mais il existe d'autres moyens aussi.

Juste déplacer le TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat") dans la définition restfulapi dans la principale build.sbt, qui ressemblerait à ceci:

... 
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") 
) 
... 

Si vous allez avoir besoin du format personnalisé dans d'autres sous-projets, en mouvement paramètres communs à un objet dans un nouveau fichier Common.scala (nommez-le que vous voulez) dans le répertoire basedir/project:

import sbt._ 

object Common { 
    val settings: Seq[Setting[_]] = Seq(
    TwirlKeys.templateFormats += ("csv" -> "views.CsvFormat") 
) 
} 

Ensuite, utilisez l'objet commun dans les sous-projets build.sbt:

name := """apirest""" 

Common.settings 

Voir la documentation Play et SBT sur les sous-projets pour plus de détails.