关于playframework 2.0:Play Framework 2.0.4 GZip

Play Framework 2.0.4 GZip

我希望Play将GZipped JS和CSS发送到浏览器。
在Build.scala中,我添加了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 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( ...

当我dist时在目标中生成我的文件:

[info]压缩的/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

,但是在prod中,该文件不可用:

无法加载资源:服务器的响应状态为404(未找到)http://ec2-54-228-70-193.eu-west-1 1.compute.amazonaws.com/assets/stylesheets/ twitterbootstrap / styles.min.css.gz

我有2个问题:

  • 为什么文件不可用?
  • 您有更好的解决方案吗?也许有一个模块?除了GreenScript之外,我没有发现其他有趣的东西,但仅适用于Play 1.x
    我想将我的资产也合并到一个文件中。

谢谢
朱利安


我花了几个小时寻找解决同一问题的方法。

尝试一下:http://play.lighthouseapp.com/projects/82401/tickets/841-gzip-assets。无论运行play dist还是play stage,它将打包.gz文件。

Given that Play is already smart enough to serve assets gzipped when a
corresponding .gz file exists, it would make sense to gzip assets when
doing 'stage' or 'dist'. Some reverse proxies can gzip resources, but
this is either less efficient (if done for each request) or more
complicated (if resources are cached, and can end up being stale).

Here's a half-baked solution using the Build.scala:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
)