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

16

版本:

  • play 2.3.4
  • sbt 0.13.1
  • scala 2.11.2

我已经按照 playframework.com 的文档 开启了公共资产的指纹识别,但对 routes.Assets.versioned 的调用从未生成带有摘要哈希值的版本化文件名。

build.sbt 中相关行:

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

项目/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以生成生产模式发布,但行为相同

有人能提供建议吗?

谢谢!

NB:我已经开始查看target/src_managed/main/routes_reverseRouting.scala中生成的类,以调试生成的versioned方法,但这似乎对于相当简单的事情来说过于复杂了。

3个回答

8

就我所记得的,几周前我也遇到了同样的问题。将资产路由更改为:

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

(请查看“file:Asset”,如果我记得正确的话,似乎需要“Asset”)

3
我们正在指定“资产”类型,但结果没有改变。 - biegel

8

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

值得注意的是,在开发模式下不会触发资产管道,您必须通过sbt start(或sbt dist,但这需要更长的时间)进行测试。

versioned方法仅检查某个资产是否具有带有.md5后缀的附带文件。 您应该检查这些文件是否存在于target/web中。


1
我已经升级使用activator,它包装了0.13.5版本,结果是一样的。我看到了.md5文件,但是(1)没有任何javascript被散列,(2)sbt-digest正在散列预编译的.scss文件而不是已编译的.css文件(我们正在使用sbt-sass插件--我意识到这可能会导致CSS的问题,但它不应该影响javascript)。唯一正确散列的文件是pngs。 - biegel
Activator使用的是0.13.5版本,但你的项目呢?请检查project/build.properties文件。你可以尝试不使用SASS插件,也许它是导致问题的原因? - Marius Soutier
1
这是sass插件,刚刚几个小时前修复了。请参阅https://github.com/ShaggyYeti/sbt-sass/pull/13获取详细信息。 - biegel
这是一个帮助我的趋势:https://groups.google.com/forum/#!topic/play-framework/5ER6ZwCJY94 - Artemis

4

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

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

在这种情况下,将sbt键RjsKeys.mainModule设置为正确的值可以解决问题,并且*.js文件会被正确地指纹。


我们也遇到了这个错误 - 感谢您的提示。 - biegel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接