2013-09-25 16 views
5

Mit vielen Schwierigkeiten zu verstehen, wie Pfade an verschiedenen Punkten in der Konfiguration und Verwendung von grunt-usemin behandelt werden.grunt-usemin Blockpfade nicht relativ zu HTML-Datei?

Ich habe folgendes Repo Layout bekommt, wo die Repo-Wurzel wird auch der Web-App root:

/dashboard/index.html 
/Gruntfile.js 
/vendor/...some 3rd party CSS and JS... 

So ist die Datei index.html -> somedomain.com/dashboard/index.html.

Die Datei index.html enthält einige CSS- und JS-Assets aus dem Ordner/vendor. Ich habe Grunzen in einem Build-Ordner setzen bauen Ausgang konfiguriert:

/build/dashboard/index.html 

In der Datei index.html, ich habe usemin Blöcke eingewickelt um alle CSS-Link und JS Script-Tags:

<!-- build:css(.) app.min.css --> 
<!-- build:js(.) app.min.js --> 

I musste einen "alternativen Suchpfad" mit "(.)" angeben, damit ein Skript-Tag für "/vendor/backbone.js" es an der richtigen Stelle findet. Bis ich das tat, suchte es nach /dashboard/vendor/backbone.js.

Ich möchte, dass die Ausgabe der CSS/JS-Assets in Build/Dashboard/app.min.css und build/dashboard/app.min.js ausgegeben und in index.html mit einem einfachen relativen " app.min.css/js "Pfad.

Das Problem ist, grunzen-usemin scheint die zu sein mit Pfad Ich bin in einer Art und Weise für beide Kontexte angeben, die es unmöglich macht, sie zusammen zu arbeiten „app.min. *“:

1) Es behandelt den Pfad relativ zum Build-Verzeichnis, um die Datei zu erstellen. Die Dateien enden in build/app.min.css und build/app.min.js.

2) Es behandelt den Pfad relativ zur Datei index.html, um die neuen link/script Tags zu erzeugen; Der Browser lädt build/dashboard/index.html, das dann versucht, "app.min.css" zu laden, was zu Build/Dashboard/app.min.css passt.

Gibt es eine Lösung?

Antwort

2

Ich mag es nicht, aber der einzige Weg, die ich gefunden habe, um es so weit ist, funktioniert einen vollständigen Pfad angeben:

<!-- build:css(.) /dashboard/app.min.css --> 
<!-- build:js(.) /dashboard/app.min.js --> 

Die führt zu der App * Dateien in/build seinen/Armaturenbrett neben index.html (das ist, wo ich sie will), und index.html endet mit den folgenden Tags auf:

<link rel="stylesheet" href="/dashboard/app.min.css"> 
<script src="/dashboard/app.min.js"></script> 

es bedeutet, der Dashboard-App der Lage ist es im ganzen jetzt bewusst ist, so Sie können ihre Position nicht einfach im Baum umbenennen oder verschieben, ohne diese Pfade zu aktualisieren.

3

Ich bin wirklich zu spät zur Party, aber ich war auch extrem frustriert von diesem Problem und fand keine zufriedenstellenden Fixes oder Work arounds. Also habe ich ein paar ziemlich schmutzige Tricks ausgearbeitet, um dieses Problem hoffentlich besser zu lösen. Ich würde es gerne mit dir teilen.

Vor allem, lassen Sie uns schnell überprüfen, warum dieses Problem auftritt. Wenn usemin Ausgabe-JS/CSS-Dateien generiert, führt es einen einfachen Pfad-Join zwischen Ihrem dest-Verzeichnis und dem Ausgabeverzeichnis durch, das Sie in Ihrem Usenemin-Block angegeben haben.Also, wenn dest ist build und usemin Block ist

<!-- build:css(.) app.min.css --> 

dann schließt er sich build mit app.min.css an die Ausgabedatei auszuspucken build/app.min.css

Aber dann einfach die usemin Aufgabe ersetzt in Ihrem Block den Weg zu Ihnen am Ende mit

<link rel="stylesheet" href="app.min.css"/> 

, die jetzt da die HTML-Datei das falsche Verzeichnis ist die Verknüpfung ist unter build/dashboard/index.html

So dreht sich meine Arbeit rund um diese Idee: Was ist, wenn dest Verzeichnis relativ ist, wo sich die HTML-Datei befindet? Würde das nicht das Problem lösen? Also was ist, wenn das obige Beispiel destbuild/dashboard ist? Sie können sehen, dass der Speicherort der Ausgabedatei ausgegeben und korrekt verknüpft wird. Denken Sie daran, dass Sie eine Kopieraufgabe erstellen müssen, um Ihre HTML-Dateien zu kopieren. Stellen Sie daher sicher, dass Ihre HTML-Datei wie zuvor nach build/dashboard/index.html kopiert wird.

Natürlich wäre die nächste Frage, was passiert, wenn ich HTML-Dateien in mehreren Verzeichnissen habe? Wäre das nicht extrem schmerzhaft und nicht intuitiv, um ein useminPrepare-Ziel für jedes Verzeichnis zu erstellen, in dem sich HTML-Dateien befinden könnten? Aus diesem Grund erstelle ich eine ganz spezielle Aufgabe, um dieses Problem zu umgehen, während ich mein eigenes Grunzengerüst erstelle. Ich nenne es useminPreparePrepare Ja, es wird absichtlich dumm genannt, weil ich hoffe, dieses Ding eines Tages ganz zu entfernen, wenn usemin Leute eine tatsächliche Reparatur für dieses Problem machen.

Wie der Name schon sagt, ist dies eine Aufgabe zur Vorbereitung von useminPrepare-Konfigurationen. Es macht genau das, was ich oben beschrieben habe. Alle Konfigurationen spiegeln UseMinPrepare-Konfigurationen wider (die meisten werden einfach in useminPrepare kopiert), mit einer Ausnahme: Sie müssen ein Verzeichnis src angeben, um das Stammverzeichnis aller Ihrer Quellen zu identifizieren, damit es den relativen Pfad generieren kann zu den HTML-Dateien. Also in Ihrem Beispiel src: "." wird in Ordnung sein. Um useminPreparePrepare zu verwenden, importieren Sie es zuerst in Ihren Build (Sie können meinen Code einfach kopieren und einfügen, das macht mir nichts aus), benennen Sie Ihre useminPrepare-Task in useminPreparePrepare um und fügen Sie die eben erwähnte src-Eigenschaft hinzu. Stellen Sie sicher, dass Sie useminPreparePrepare mit dem gewünschten Ziel ausführen, und führen Sie dann sofort UminPrepare ohne Angabe des Ziels aus, sodass alle seiner Ziele ausgeführt werden. Dies liegt daran, dass useminPreparePrepare ein Ziel für jedes Verzeichnis generiert, relativ zu dem, wo HTML-Dateien gefunden werden, und Kopien über Ihre Konfigurationen für das useminPreparePrepare-Ziel Ihres ran. Auf diese Weise kann Ihre Konfiguration einfach nach allen HTML-Dateien suchen.

Beispiel

"useminPreparePrepare": { 
    // Search for HTML files under dashboard even though src is . 
    // because we want to avoid including files generated under build directory. 
    html: "dashboard/**/*.html", 
    options: { 
     src: ".", 
     dest: "build", 
     ... 

"usemin": { 
    html: ["build/**/*.html"], 
    ... 

"copy": { 
    html: { 
     files: [{ 
       expand: true, 
       src: ["dashboard/**/*.html"], 
       dest: "build" 
      } 
     ] 
    }, 
    ... 

hoffe, das hilft! Haben Sie einen guten Tag.

EDIT: Ich erkannte, dass in dem obigen Beispiel, wenn Sie tatsächlich alle HTML-Dateien aus dem aktuellen Verzeichnis enthalten, Sie auch die generierten HTML-Dateien enthalten, wenn sie nicht vor der Zeit gereinigt werden. Also entweder Sie reinigen sie vor ihnen oder schauen Sie unter dashboard Verzeichnis. Ich würde empfehlen, src und dest Verzeichnisse zu trennen, damit config viel intuitiver aussehen könnte.