Как настроить активацию отпечатков в Play 2.3.4?

Версии:

  • 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>

Я не получаю ошибок компилятора. Отпечаток пальца просто "не работает". Я предполагаю, что мне не хватает чего-то простого, но я не вижу его.

Другие примечания:

  • running find . -name "*.js" в корне проекта не отображается файлов с дайджестом, добавленным к началу, так как в документации предлагается
  • Я запустил sbt clean dist, чтобы сгенерировать выпуск режима производства, и поведение такое же

Кто-нибудь может посоветовать?

Спасибо!

NB: я начал просматривать сгенерированный класс в target/src_managed/main/routes_reverseRouting.scala для отладки сгенерированного метода versioned, но это кажется излишним для чего-то довольно простого.

Ответы

Ответ 1

Прежде всего, вы должны обновить до sbt 0.13.5, потому что sbt-web и его плагины используют функцию sbt, называемую "автоматические плагины", которая была введена в 0.13.5.

Конвейер ресурсов, кстати, не запускается в режиме разработки, вам нужно протестировать через sbt start (или sbt dist, но это занимает больше времени).

Метод versioned просто проверяет, имеет ли ресурс компаньон с суффиксом .md5. Вы должны проверить, существуют ли эти файлы в target/web.

Ответ 2

Насколько я помню, у меня была такая же проблема несколько недель назад. Измените маршрут ресурса на:

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

(см. "file:Asset" - кажется, что "Asset" требуется, если я правильно помню)

Ответ 3

Если задача rjs конвейера встречает некоторую проблему, тогда задача дайджеста может работать неправильно. Например, это происходит, когда основная точка входа по умолчанию для rjs не найдена:

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

В этом конкретном случае установка ключа sbt RjsKeys.mainModule в правильное значение решает проблему, а файлы *.js правильно отпечатываются.