【问题标题】:How to set up asset fingerprinting in Play 2.3.4?如何在 Play 2.3.4 中设置资产指纹?
【发布时间】:2014-11-02 03:36:33
【问题描述】:

版本:

  • 玩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 方法,但这对于相当简单的事情来说似乎有点过头了。

【问题讨论】:

    标签: scala playframework playframework-2.3


    【解决方案1】:

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

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

    (请参阅“file:Asset” - 如果我没记错的话,似乎需要“Asset”)

    【讨论】:

    • 我们指定了Asset 类型,但结果是一样的
    【解决方案2】:

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

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

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

    【讨论】:

    • 我们也遇到了这个错误——感谢您的提示。
    【解决方案3】:

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

    顺便说一句,资产管道不会在开发模式下触发,您必须通过sbt start(或sbt dist,但这需要更多时间)进行测试。

    versioned 方法只检查资产是否有带有.md5 后缀的伴侣。您应该检查这些文件是否存在于target/web

    【讨论】:

    • 我已经升级到使用激活器,它包装了 0.13.5,结果是一样的。我看到了 .md5 文件,但是 (1) 没有一个 javascript 被散列,并且 (2) sbt-digest 正在散列预编译的 .scss 文件而不是编译的 .css 文件(我们使用的是 sbt-sass 插件——它我意识到可能会导致 CSS 出现问题,但它不应该影响 javascript)。唯一正确散列的文件是 pngs。
    • Activator 使用 0.13.5,但是你的项目呢?检查project/build.properties。您可以尝试不使用 SASS 插件,也许它会导致问题?
    • 这是 sass 插件,几小时前才打补丁。详情请见github.com/ShaggyYeti/sbt-sass/pull/13
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多