2016-05-25 12 views
0

Ich habe ein ziemlich spezifisches Problem: Ich versuche, einen komplexen Stapel mit Sails.js mit machinpack-sailsgulpify zu bauen.gulp-inject: fehlende End-Tag für Start-Tag bei der Verwendung von Mops

Um Assets in meine Vorlagen zu injizieren, benutze ich gulp-inject Plugin, wie das Maschinenpaket vorschlägt. Das Problem ist, dass für alles andere als html und ejs der Injektor nicht funktioniert. Es ändert einfach nichts. Keine Fehler, nichts.

Meine Aufgabe sieht wie folgt aus:

gulp.task('sails-linker-gulp:devViews', function() { 
    return gulp.src('views/**/*.?(html|ejs|jade|pug|haml|slim|dust)') // Read templates 
     .pipe(
     plugins.inject(
      gulp.src(require('../pipeline').jsFilesToInject, {read: false}), // Link the javaScript 
      { 
      starttag: generateScriptStartTag, 
      endtag: generateScriptEndTag, 
      ignorePath: '.tmp/public', 
      transform: (filepath, file, i, length) => { 
       return `script(src="${filepath}")`; 
      } 
      } 
     ) 
    ) 
     .pipe(
     plugins.inject(
      gulp.src(require('../pipeline').cssFilesToInject, {read: false}), // Link the styles 
      { 
      starttag: generateStyleStartTag, 
      endtag: generateStyleEndTag, 
      ignorePath: '.tmp/public' 
      } 
     ) 
    ) 
     .pipe(
     plugins.inject(
      gulp.src(['.tmp/public/jst.js'], {read: false}), // Link the JST Templates 
      { 
      starttag: generateTemplateStartTag, 
      endtag: generateTemplateEndTag, 
      ignorePath: '.tmp/public' 
      } 
     ) 
    ) 
     .pipe(gulp.dest('views/'))// Write modified files... 

Sorgen Sie sich nicht über die generateScriptStartTag und solche Funktionen, sie sind da nur für die Kontrolle und ich bin 1000% sicher, dass sie korrekt funktionieren, getestet viel. Sie erzeugen die Tags wie folgt:

//- SCRIPTS 
//- SCRIPTS END 

je nach Vorlagensprache.

Das Hinzufügen der benutzerdefinierten Transformationsfunktion funktionierte nicht. Wenn ich ejs oder html oder wirklich alles verwende, das HTML-Syntax ähnelt, funktioniert es gut.

Jetzt, über Sails: Ich kann keine Schluckaufgabe hinzufügen, um die Vorlage vor dem Injizieren zu kompilieren, weil Sails Vorlagen auf Anforderung in der Entwicklung rendert, sie nicht wirklich in irgendeinem Verzeichnis vorkompiliert. Und ehrlich: warum sollte ich? Die Injektion fügt nur Zeilen zu meinen .jade/.pug Dateien in views hinzu, die Dateien sind bereits da, also sehe ich nicht, warum es dort ein Problem gibt. Kann jemand beraten?

UPDATE: Eher frustrierend Inspektion des Codes ergab, dass die ‚Streichhölzer‘ Eigenschaft beim Ausführen der inject Funktion hat die Länge 0 und wenn die content des Stroms in Knoten Inspektoren Inspektion, ich sah nicht die Kommentare, Sie wurden entfernt, obwohl sie offensichtlich in der Akte sind.

UPDATE # 2: Es scheint, dass ich falsch über ejs war. NUR HTML-Dateien werden verarbeitet. Es funktioniert auch, wenn es die Injektionskommentare nicht erkennt. Wenn es jedoch das Endereignis tut, wird für diese Datei einfach nie ausgegeben und nichts wird injiziert. Dies gilt für ALLE Template-Engines, nur statische HTML-Dateien funktionieren einwandfrei.

UPDATE # 3: Nach weiteren 5 Stunden Debuggen fand ich das Problem, aber mein Verständnis von Streams ist nicht gut genug, um mich näher an die Lösung. Das Problem ist, dass in inject Funktion des Plugins gibt es eine Schleife, die nicht ordnungsgemäß beendet, und während es perfekt die erforderlichen Tags in den Stream injiziert, führt es dann diese Schleife erneut auf den gleichen Strom (mit injizierten Tags) und Würfe ein Fehler. Debugger at the fault point Warum dieser Fehler nie in irgendeiner Konsole auftauchte, weiß ich nicht, aber dort gehen Sie. Kann mir bitte jemand helfen? Ich bin damit völlig verloren ... Ist es ein Fehler im Plugin?

Antwort

0

Ich musste das selbst herausfinden. Es ist ein Fehler in gulp-inject. Die Regex, die dieses Plugin generiert, um mit den Injektionstags zu testen, stimmt nicht mit der gesamten Zeile überein, es entspricht einfach dem ersten Vorkommen.Das bedeutet, dass, wenn ich meine Tags gesetzt wie so: //SCRIPTS zweimal:

//SCRIPTS 
//SCRIPTS END 

Die Regex die starttag übereinstimmen regex result

Und das End-Tag wird nur einmal abgestimmt werden. Dies verursachte die zweite fehlerhafte Schleife mit dem Fehler für die fehlende Endmarkierung.

Eine Problemumgehung besteht darin, das wiederholte Starten von Tags zu vermeiden.

//SCRIPTS 
//END SCRIPTS 

Das ist jedoch keine Lösung. Eine Lösung wäre es, die Regex so zu ändern, dass sie nur Leerzeichen und Zeilenumbrüche erlaubt, um das Tag zu finden, wenn eine Einrückungs-basierte Vorlagensprache verwendet wird. So etwas wie dies funktionieren würde: /\/\/-\s*SCRIPTS(?=\s*\n|$)/ig working exaple

Kann nicht glauben, dass niemand auf das bisher gestolpert ist, scheint, wie es ein häufiges Problem wäre ...