2014-09-08 5 views
16

Versionen:Wie richtet man Asset Fingerprinting in Play 2.3.4 ein?

  • Spiel 2.3.4
  • sbt 0.13.1
  • scala 2.11.2

Ich habe die documentation on playframework.com gefolgt von Fingerabdrücken auf öffentlichen Vermögens zu ermöglichen, fordert jedoch zu routes.Assets.versioned niemals einen versionierten Dateinamen mit einem Digest-Hash erzeugen.

Relevante Linien in build.sbt:

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

Relevante Zeilen in Projekt/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") 

Relevante Linien in conf/Touren

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

Und die Hauptvorlage:

@(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> 

Der Ausgang ist immer:

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

ich keine Compiler-Fehler erhalten. Der Fingerabdruck "funktioniert einfach nicht". Ich nehme an, ich vermisse etwas Einfaches, aber ich kann es nicht sehen.

Andere Anmerkungen:

  • find . -name "*.js" in der Wurzel des Projekts ausgeführt zeigt keine Dateien, die eine an den Anfang beigefügten verdauen, wie die Dokumentation
  • schlägt vor, ich sbt clean dist laufen habe einen Produktionsmodus zu erzeugen, Freigabe und das Verhalten ist das gleiche

Kann jemand beraten?

Vielen Dank!

NB: Ich habe angefangen, durch die generierte Klasse in target/src_managed/main/routes_reverseRouting.scala zu suchen, um die generierte versioned Methode zu debuggen, aber das scheint wie Overkill für etwas, das ziemlich einfach ist.

Antwort

8

Zunächst einmal sollten Sie auf sbt 0.13.5 aktualisieren, da sbt-web und seine Plugins eine sbt-Funktion namens "auto-plugins" verwenden, die in 0.13.5 eingeführt wurde.

Die Asset-Pipeline durch die Art und Weise ist nicht im Entwicklungsmodus ausgelöst, müssen Sie über sbt start testen (oder sbt dist aber das braucht mehr Zeit).

Die Methode versioned prüft nur, ob ein Asset einen Companion mit dem Suffix .md5 hat. Sie sollten überprüfen, ob diese Dateien in target/web vorhanden sind.

+1

Ich habe aktualisiert, Aktivator zu verwenden, der 0,13.5 umschließt und das Ergebnis ist das gleiche. Ich sehe .md5-Dateien, aber (1) keine der Javascript ist Hashed, und (2) sbt-Digest ist Hash-vorkompilierte .scss-Dateien anstelle der kompilierten .css-Dateien (wir verwenden sbt-sass-Plugin - die Ich stelle fest, dass das Problem mit CSS verursacht wird, aber es sollte nicht Auswirkungen auf Javascript haben). Die einzigen Dateien, die korrekt gehashed wurden, sind PNGs. – biegel

+0

Activator verwendet 0.13.5, aber machen Sie Ihr Projekt? Überprüfen Sie 'project/build.properties'. Können Sie ohne das SASS-Plugin versuchen, vielleicht verursacht es das Problem? –

+1

Es war das Sass-Plugin, es wurde erst vor ein paar Stunden gepatcht. Einzelheiten finden Sie unter https://github.com/ShaggyYeti/sbt-sass/pull/13. – biegel

8

Soweit ich mich erinnern kann, hatte ich das gleiche Problem vor ein paar Wochen.Ändern Sie den Asset-Route:

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

(Siehe „file:Asset“ - es scheint, dass „Asset“ erforderlich ist, wenn ich mich richtig erinnere)

+3

Wir geben den 'Asset'-Typ an, aber das Ergebnis ist das gleiche – biegel

4

Wenn die rjs Aufgabe der Pipeline ein Problem stößt, dann ist die Die Digest-Aufgabe funktioniert möglicherweise nicht ordnungsgemäß. Zum Beispiel geschieht dies, wenn der Standard-Haupteinstiegspunkt für rjs nicht gefunden wird:

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

In diesem speziellen Fall die sbt Schlüssel RjsKeys.mainModule auf den richtigen Wert einstellen, löst das Problem und * JS-Dateien richtig Fingerabdrücke abgenommen werden.

+0

Wir bekamen auch Dieser Fehler - Danke für den Tipp. – biegel

+0

Danke für den Tipp! Das hat es in meinem Fall gelöst. –

Verwandte Themen