2013-06-06 5 views
0

Je veux jouer pour envoyer JS et CSS GZipped au navigateur. Dans le Build.scala, j'ai ajoutéPlay Framework 2.0.4 GZip

val gzipAssets = TaskKey[Seq[File]]("gzip-assets", "GZIP all assets") 
lazy val gzipAssetsSetting = gzipAssets <<= gzipAssetsTask 
lazy val gzipAssetsTask = (gzippableAssets, streams) map { 
    case (finder: PathFinder, s: TaskStreams) => { 
    finder.get.map { file => 
     val gzTarget = new File(file.getAbsolutePath + ".gz") 
     IO.gzip(file, gzTarget) 
     s.log.info("Compressed " + file.getAbsolutePath + " " + file.length/1000 + " k  => " + gzTarget.getName + " " + gzTarget.length/1000 + " k") 
     gzTarget 
    } 
    } 
} 

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    // Twitter Bootstrap v2.0.1 compilation (https://plus.google.com/u/0/108788785914419775677/posts/QgyUF9cXPkv) 
    lessEntryPoints <<= (sourceDirectory in Compile)(base => ((base/"assets"/"stylesheets"/"twitterbootstrap"/"styles.less"))), 

    // set up gzip of assets 
    gzippableAssets <<= (resourceManaged in (ThisProject))(dir => ((dir ** "*.js") +++ (dir ** "*.css"))), 
    gzipAssetsSetting, 
    playPackageEverything <<= playPackageEverything dependsOn gzipAssets 


).settings(... 

qui me fichiers dans la cible génère quand je dist:

[info] comprimé /Users/wimha/Documents/**/target/scala-2.9 .1/resource_managed/main/public/stylesheets/twitterbootstrap/styles.min.css 183 k => styles.min.css.gz 27 k

mais, en prod, le fichier ne sont pas disponibles:

Impossible de charger la ressource: le serveur a répondu avec un statut de 404 (non trouvé) http://ec2-54-228-70-193.eu-west- 1.compute.amazonaws.com/assets/stylesheets/twitterbootstrap/styles.min.css.gz

J'ai 2 questions:

  • Pourquoi n'est pas le fichier disponible?
  • Avez-vous une meilleure solution? Peut-être avec un module? Je n'ai pas trouvé quelque chose d'intéressant excepté GreenScript mais c'est seulement pour Play 1.x J'aimerais aussi que mes assets soient fusionnés en un seul fichier.

Merci Julien

Répondre

1

j'ai perdu des heures à la recherche d'une solution pour le même problème.

Essayez ceci: http://play.lighthouseapp.com/projects/82401/tickets/841-gzip-assets. Il va empaqueter les fichiers .gz si vous exécutez play dist ou play stage.

Étant donné que le jeu est déjà assez intelligent pour servir les actifs gzip lorsqu'un existe correspondant fichier .gz, il serait judicieux de gzip actifs quand faire « étape » ou « dist ». Certains proxys inverses peuvent gzip ressources, mais c'est soit moins efficace (si fait pour chaque demande) ou plus compliqué (si les ressources sont mises en cache, et peuvent finir par être périmé).

est ici une solution demi-cuite au four en utilisant la Build.scala:

val gzippableAssets = SettingKey[PathFinder]("gzippable-assets", "Defines the files to gzip") 
val gzipAssets = TaskKey[Seq[File]]("gzip-assets", "gzip all assets") 
lazy val gzipAssetsSetting = gzipAssets <<= gzipAssetsTask dependsOn (copyResources in Compile) 
lazy val gzipAssetsTask = (gzippableAssets, streams) map { 
    case (finder: PathFinder, s: TaskStreams) => { 
    var count = 0 
    var files = finder.get.map { file => 
     val gzTarget = new File(file.getAbsolutePath + ".gz") 
     IO.gzip(file, gzTarget) 
     count += 1; 
     gzTarget 
    } 
    s.log.info("Compressed " + count + " asset(s)") 
    files 
    } 
} 

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    ... 
    gzippableAssets <<= (classDirectory in Compile)(dir => (dir ** ("*.js" || "*.css" || "*.html"))), 
    gzipAssetsSetting, 
    playPackageEverything <<= playPackageEverything dependsOn gzipAssets 
)