2015-03-03 4 views
13

Unter meinem assets/ Ordner, ich habe zahlreiche Unterordner, die jeweils eine beliebige Anzahl von Bildern enthalten, etwa so:Gulp: Wie setze ich den Zielordner relativ zur verarbeiteten Datei (bei Verwendung von Platzhaltern)?

assets/article1/ 
assets/article2/ 

Ich versuche, einen Schluck Aufgabe zu schreiben alle .jpg Bilder innerhalb ausfindig zu machen und ihre Miniaturversionen zu erzeugen , um in einem thumbs/ Unterordner im Ordner gespeichert werden, wobei jede Datei befindet:

assets/article1/    # original jpg images 
assets/article1/thumbs/  # thumbnail versions of above.. 
assets/article2/ 
assets/article2/thumbs/ 

ich habe versucht, verschiedene Ansätze, aber kein Glück. Der nächstgelegene ich gekommen ist:

gulp.task('thumbs', function() { 
    return gulp.src('./assets/**/*.jpg') 
     .pipe(imageResize({ width: 200 })) 
     .pipe(gulp.dest(function(file) { return file.base + '/thumbs/'; })); 
}); 

jedoch das schafft einen einzelnen thumbs\ Ordner an der Wurzel assets\

assets/article1/ 
assets/article2/ 
assets/thumbs/article1/ 
assets/thumbs/article2/ 

Gibt es eine gute Informationen über die Pfade und Platzhalter überall? Klar bin ich es nicht gut Handhabung ..

Antwort

7

Sie path.dirname dafür verwenden könnte: http://nodejs.org/api/path.html#path_path_dirname_p

// require core module 
var path = require('path'); 

gulp.task('thumbs', function() { 
    return gulp.src('./assets/**/*.jpg') 
     .pipe(imageResize({ width: 200 })) 
     .pipe(gulp.dest(function(file) { return path.join(path.dirname(file.path), 'thumbs'); })); 
}); 
+0

Dank. Näher, nehme ich an, aber nicht ganz da. Produziert: 'assets/article1/thumbs/article1 /' Wird in 'Pfad 'graben mehr .. – pete

+1

Dies ist ein bisschen schwierig wegen Ihrer rekursiven glob mit' **/*. Js '. Vielleicht werfen Sie einen Blick auf dieses offizielle Rezept: https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-task-ste-s-per-folder.md – tmaximini

+0

Ich denke, ich bekomme, was sie ' re doing - Erstellen Sie eine Liste von Ordnern und führen Sie dann eine Aufgabe für jeden Ordner einzeln aus. Nachdem ich einen halben Tag darauf gebrannt hatte, änderte ich am Ende die App, um nach dem Daumen-Ordner zu suchen, der die Wurzel der Assets bildete;) Aber ich schätze die Hilfe, gut zu wissen für das nächste Mal! – pete

2

Hier ist, was für mich angesichts der folgenden Verzeichnisstruktur (arbeitete vereinfacht ich ein wenig konzentrieren sich auf nur immer die Dateien in der richtigen Stelle)

assets/article1/1.jpg 
assets/article2/2.jpg 

mit einem gewünschten Ergebnis

assets/article1/1.jpg 
assets/article1/thumbs/1.jpg 
assets/article2/2.jpg 
assets/article2/thumbs/2.jpg 

Hier ist, was für mich gearbeitet (von diesem Rezept modifizierte https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-task-steps-per-folder.md)

var gulp = require('gulp'), 
    rename = require('gulp-rename'), 
    path = require('path'), 
    fs = require('fs'); 

var scriptsPath = 'assets'; // folder to process 

function getFolders(dir) { 
    return fs.readdirSync(dir) 
     .filter(function(file) { 
     return fs.statSync(path.join(dir, file)).isDirectory(); 
     }); 
} 

gulp.task('thumbs', function() { 
    var folders = getFolders(scriptsPath); 

    return folders.map(function(folder) { 
     return gulp.src(path.join(scriptsPath, folder, '/**/*.jpg')) 
     .pipe(rename({dirname: folder + '/thumbs/'})) 
     .pipe(gulp.dest(scriptsPath)); 
    }); 
}); 
+0

Ich fühle mich nicht so ist eine gute Möglichkeit, damit umzugehen. Könnten Sie Ihre Lösung ausarbeiten? Mein Hauptproblem ist, dass gulp.src() Ihnen einen Vinyl-Stream gibt und ein Vinyl-Stream in gulp.task als Rückgabewert benötigt wird. Was Sie tun, ist eine Reihe von Vinyl-Streams zurückgeben. Ab der aktuellen stabilen Version von Gulp.js (3.9.x) könnte das zu schrecklichen Nebenwirkungen führen. Werfen Sie einen Blick auf dieses Problem hier: https://github.com/gulpjs/gulp/issues/95 - Lösung: https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple- sources-in-one-task.md – androidavid

Verwandte Themen