如何在Play 2.3.4中设置资产指纹识别?

时间:2014-09-08 20:08:50

标签: scala playframework playframework-2.3

版本:

  • 播放2.3.4
  • sbt 0.13.1
  • scala 2.11.2

我已按照documentation on playframework.com启用了对公共资源的指纹识别,但对routes.Assets.versioned的调用从不会产生带有摘要哈希的版本化文件名。

build.sbt中的相关行:

scalaVersion := "2.11.2"
pipelineStages := Seq(rjs, digest)

project / plugins.sbt中的相关行:

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.4")
addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.5")
addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")

conf / routes中的相关行:

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

主要模板:

@(title: String, lang: String, cssClasses: String, bodyContents: Html)
<!DOCTYPE html>
<html lang="@lang">
  <head>
    <meta charset="UTF-8">
    <title>@title</title>
    <script type="text/javascript" src="@routes.Assets.versioned("javascript/components/main.js")"></script>
  </head>
  <body>
    <div class="layout @cssClasses">
    @bodyContents
    </div>
  </body>
</html>

输出始终为:

<!DOCTYPE html>
<html lang="el">
<head>
  <meta charset="UTF-8">
  <title>[title]</title>
  <script type="text/javascript" src="/assets/javascript/components/main.js"></script>
</head>
<body>
...
</body>
</html>

我没有编译错误。指纹只是“不起作用”。我想我错过了一些简单的东西,但我看不到它。

其他说明:

  • 在项目的根目录中运行find . -name "*.js"显示没有文件在开头附加了摘要,正如文档所示
  • 我已经运行sbt clean dist来生成生产模式版本并且行为相同

有人可以提供建议吗?

谢谢!

注意:我已经开始查看target/src_managed/main/routes_reverseRouting.scala中生成的类来调试生成的versioned方法,但这看起来有点过分了。

3 个答案:

答案 0 :(得分:8)

首先,您应该更新到sbt 0.13.5,因为sbt-web及其插件使用0.13.5中引入的名为“auto-plugins”的sbt功能。

资产管道不是在开发模式中触发的,您必须通过sbt start(或sbt dist进行测试,但需要更多时间)。

versioned方法仅检查资产是否具有.md5后缀的随播广告。您应该检查这些文件是否存在于target/web

答案 1 :(得分:8)

据我所知,几个星期前我遇到了同样的问题。将资产路线更改为:

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

(请参阅&#34; file:Asset&#34; - 如果我没记错的话,似乎需要&#34; Asset&#34;

答案 2 :(得分:4)

如果管道的rjs任务遇到一些问题,那么摘要任务可能无法正常工作。例如,当找不到rjs的默认主入口点时会发生这种情况:

Error: Error: .../target/web/rjs/appdir/javascripts/main.js does not exist.

在这种特殊情况下,将sbt键RjsKeys.mainModule设置为正确的值可以解决问题,* .js文件可以正确指纹识别。