2015-07-09 7 views
8

Meine Frage mit einem anderen beginnt, fragte sich hier: Gulp: How to set dest folder relative to processed file (when using wildcards)?Erläuterung der Knotenpfade bezüglich .pipe schlingen()

ich eine ähnliche Situation haben, wo ich komprimierte Versionen auf einer Pro-Modulbasis vornehmen müssen. Das heißt, ich habe

ui/test/one/script1.js 
ui/test/two/script2.js 

und ich muss haben schluck die Dateien in relativen Verzeichnisse kopieren, damit ich mit

ui/test/one/compressed/script1.js 
ui/test/two/compressed/script2.js 

am Ende habe ich die folgende schluck Aufgabe

gulp.task('test', function() { 
    return gulp.src('ui/test/**/*.js') 
     .pipe(gulp.dest(function(file) { 
      return path.join(path.dirname(file.path), 'compressed'); 
     })); 
}); 

jedoch Wenn ich es starte, habe ich am Ende

ui/test/one/compressed/one/script1.js 
ui/test/two/compressed/two/script2.js 

Ich sehe in der docs, wo es heißt

cwd - Geben Sie das Arbeitsverzeichnis der Ordner ist relativ. base - Geben Sie den Ordner relativ zum cwd an. Standard ist, wo der Glob beginnt. Dies wird verwendet, um die Dateinamen zu bestimmen, wann in .dest Speichern()

ich einige Fragen haben, speziell über .src(), .dest() und den Pfad und Dateiobjekte. (Das heißt, obwohl Ich bin mir sicher, es gibt andere Möglichkeiten, um mein Endziel zu erreichen, diese Frage bezieht sich speziell auf das Verhalten der oben genannten Beispielschluckcode und die Funktionen erwähnt, damit ich ihr Verhalten und API besser verstehen.)

Fragen

  • Wenn die docs sagen, „das Arbeitsverzeichnis der Ordner ist relativ“, in welchem ​​Ordner ist das?
  • auf die gleiche Note, in Bezug auf this comment und die Stelle in der Dokumentation, wo es heißt "Basis - Geben Sie den Ordner relativ zum cwd. Standard ist, wo der glob beginnt" was bedeutet "wo der glob beginnt"? Mein Verständnis von 'glob' ist, dass es die ganze Zeichenfolge ist, aber bedeutet es wirklich ein * Zeichen in dieser Zeichenfolge? Also für 'einige/ordner/**/*. Js' mit einer Datei bei some/folder/a/b/c/foo.js Ich bin mir nicht sicher, ob die Basis ist some/folder/, some/folder/a/ oder some/folder/a/b/c/?
  • gibt es eine Möglichkeit zu sagen <where the glob begins> + '..'?
  • wo ich sage path.join (path.dirname (file.path), 'komprimiert') Ich nehme an, dass produziert C:\blah\ui\test\one\compressed. Es folgt dann, dass, was auch immer der tatsächliche Name der Datei entschieden hat, one\script1.js berücksichtigt. Wie ändere ich seine Meinung, so dass es nur an script1.js denkt?

Hinweis: Ich habe versucht, die folgenden (mit schluck-debug) tun

gulp.task('test', function() { 
    return gulp.src('ui/test/**/*.js', {cwd: './'}) 
     .pipe(debug({minimal: false})) 
     .pipe(rename(function(path) { 
      path.basename =  path.basename.substring(path.basename.lastIndexOf('\\') + 1); 
     })) 
     .pipe(debug({minimal: false})) 
     .pipe(gulp.dest(function(file) { 
      return path.join(path.dirname(file.path), 'compressed'); 
     })); 
}); 

Die Konsole die folgende Ausgabe für diese Version der Aufgabe hat:

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\one\script1.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\one\script1.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\two\script2.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\two\script2.js 

So scheint es, dass Die Umbenennung hat keine Auswirkungen auf den Pfad. Ich habe auch versucht, den Pfad zu ändern.dirname in der Umbenennungsleitung, konnte jedoch nichts finden, das den gewünschten Effekt hätte, den falschen Verzeichnisnamen einfach aus dem endgültigen Ausgabepfad zu entfernen.

Meine letzte Frage ist dann, was genau path.basename und path.dirname für das Pfadobjekt enthalten, das an die Umbenennungsfunktion übergeben wird?

bearbeiten: Ich habe this zum Debuggen von Schluck Aufgaben gefunden. Dabei mit einer debugger; Anweisung in der Umbenennungsfunktion platziert mir erlaubt, den Pfad Objekt zu untersuchen, die wie folgt aussieht:

{ 
    basename: "script1", 
    dirname: "one", 
    extname: ".js" 
} 

Einstellung path.dirname zu '' in den Umbenennungs Ergebnisse in

ui/test/compressed/script1.js 
ui/test/compressed/script2.js 

so Es kann sein, dass rename() selbst nicht nützlich ist für das, was ich brauche. Es sieht eher wie die Basisoption für .src() aus, wo der Schlüssel liegt, aber die Dokumente sind eher knapp.

+0

Sieht so aus, als hätten Sie einen Weg gefunden, den Pfad so zu ändern, wie Sie ihn in der letzten '.pipe' benötigen. Was ist also die Frage? Warum erlaubt Schluck nicht-Standard-Szenario aus der Box? –

+0

@KirillSlatin Ich komme mit 'ui/test/one/compressed/one/script1.js ', wo was ich brauche ist' ui/test/one/compressed/script1.js'. Diese Sekunde '/ one' ist, was ich vermeiden will. Ich änderte dieses Rezept https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-task-steps-per-folder.md und konnte bekommen, was ich brauche, also wenn das Kopfgeld abläuft und Niemand sonst kümmert sich darum, es zu behaupten, indem ich antworte. Ich werde dann eine Antwort mit dem, was ich gefunden habe, posten. Ich benutzte einen Hash im Umbenennen, was genau das war, was ich brauchte. – jinglesthula

+0

Ich sollte beachten, dass mein vorheriger Kommentar sich auf das Endergebnis bezieht, und nicht auf die tatsächlichen Fragen über .src() und .dest() und wie die Handle-Pfade, die ich hier tatsächlich gefragt habe. Also, ich werde posten, was ich auf der anderen Frage gefunden habe, dass es tatsächlich die Antwort auf :) ist – jinglesthula

Antwort

5

Frage 1:

gulp.src('ui/test/**/*.js') 

Diese Zeile '/ ui/test /' als Root-Verzeichnis ('Arbeitsdateiverzeichnis') setzt, wie es die Basis des glob Muster ist. Aus diesem Grund waren die relativen Pfade, die zu dest gespeist wurden, "one/script1.js" und "two/script2.js".

Frage 2:

von glob, beziehen sich die Dokumentation zu Ihrem '**/* js.' -Muster. Also ist die Basis Ihres Globs die gleiche, die es als Ihr Root-Verzeichnis verwendet, "/ ui/test /", was in diesem Fall die gleichen Dinge bedeutet wie "Ordner relativ zum cwd".

Frage 3:

Die ‚Basis‘ Eigenschaft für jeden Pfad für jede Datei aus dem gulp.src Strom kommt zum glob2base Modul ähnlich eingestellt wird.

glob2base(new glob.Glob('/ui/test/**/*.js')) + '..'; 

ist die gleiche wie

file.base + '..'; 

wenn das Sinn macht für Sie.

Frage 4:

Ich nehme an, Sie gulp-rename in Ihrem zweiten Abschnitt des Codes verwenden. Das sollte dein Problem lösen.

gulp.src('ui/test/**/*.js') 
    .pipe(rename(function(path){ 
     path.basename = 'compressed/' + path.basename; 
    }) 
    .pipe(gulp.dest(function(file) { 
     return file.base; 
    })); 

Die anderen Optionen, die können übergeben werden können, um gulp.src here zu finden, aber ich glaube nicht, jeder von ihnen direkt lösen, was Sie zu tun versuchen. gulp.src scheint nicht zu erwarten, dass Sie in einem neuen Verzeichnis in der Mitte jedes Pfades hacken, also ist das Umbenennen die einfachste Lösung.

Ich beschuldige dich nicht für Probleme beim Ausfindigmachen der Dokumente. Ich musste zwischen drei oder vier verschiedenen GitHub-Seiten springen, um alles zusammenzufügen. Ich hoffe du hast genauso viel gelernt wie ich.