2014-04-09 5 views
16

Ich versuche, Aufgaben dynamisch zu erstellen (Minify und Concat) basierend auf jsFiles Objekt. Der Schlüssel gibt den Zieldateinamen an und das Array enthält die Quelldateien. Wenn ich schlucke, sehe ich, dass alle Aufgabennamen laufen, aber es schreibt nur den letzten Schlüssel, der in diesem Fall group2.js ist. Was ist hier falsch?Erstellen von Aufgaben mit einer Schleife [Schluck]

// imports here 

var jsFiles = 
{ 
    group1:[file1.js,file2.js], 
    group2:[file2.js,file3.js] 
}; 

for (var key in jsFiles) 
{ 
    gulp.task(key, function() { 
     return gulp.src(jsFiles[key]) 
     .pipe(jshint()) 
     .pipe(uglify()) 
     .pipe(concat(key + '.js')) // <- HERE 
     .pipe(gulp.dest('public/js')); 
    }); 
} 

var defaultTasks = []; 
for (var key in jsFiles) 
{ 
    defaultTasks.push(key); 
} 
gulp.task('default', defaultTasks); 

Antwort

0

Lösung auf jslinterrors.com/dont-make-functions-within-a-loop basiert:

var jsFiles = 
{ 
    group1:[file1.js,file2.js], 
    group2:[file2.js,file3.js] 
}; 

function createTask(key) 
{ 
    return gulp.src(jsFiles[key]) 
     .pipe(jshint()) 
     .pipe(uglify()) 
     .pipe(concat(key + '.js')) 
     .pipe(gulp.dest('public/js')); 

} 

for (var key in jsFiles) 
{ 
    createTask(key); 
} 

var defaultTasks = []; 
for (var key in jsFiles) 
{ 
    defaultTasks.push(key); 
} 
gulp.task('default', defaultTasks); 
+0

Diese Lösung hat nicht für mich funktioniert. Es scheint createTask (Schlüssel) ist nicht genug. Wenn Sie gulp.task (key) nicht explizit aufrufen, kann gulp die Aufgabe nicht finden, wenn die Standardaufgabe ausgeführt wird. Ich benutzte Oaleyniks Antwort. – Chris

+0

Wie könnte ich alle Aufgaben asynchron ausführen? –

6

Erfassung der Wert von 'Schlüssel' Variable bei jeder Iteration mit IIFE. In Ihrem Beispiel ist im Moment der Concat-Aufruf Schleife bereits beendet und Variable Schlüssel wird den letzten Wert haben.

for (var key in jsFiles) 
{ 
    (function(key) { 
     gulp.task(key, function() { 
      return gulp.src(jsFiles[key]) 
       .pipe(jshint()) 
       .pipe(uglify()) 
       .pipe(concat(key + '.js')) // <- HERE 
       .pipe(gulp.dest('public/js')); 
     }); 

    })(key); 

} 

Ausführliche Erklärung siehe diese function closures - Vermeidung des Referenz Problem Abschnitt

+2

Diese Lösung funktioniert, aber lint warnt davor, Funktionen innerhalb von Schleifen zu erstellen. – cmancre

+0

@cmancre als getrennte Funktion kann deklariert und in Schleife mit dem Schlüsselparameter aufgerufen werden, der durch ref in Funktion gesendet wird. Eine Antwort auf die aktuelle Frage ist die Erfassung der Iterationsvariablen. Sie haben in der Frage nicht die Forderung nach erfolgreichem Linting erwähnt (: – oaleynik

21

Eine weitere Option ist funktional Array Looping Funktionen mit Object.keys kombiniert zu verwenden, etwa so:

var defaultTasks = Object.keys(jsFiles); 

defaultTasks.forEach(function(taskName) { 
    gulp.task(taskName, function() { 
     return gulp.src(jsFiles[taskName]) 
      .pipe(jshint()) 
      .pipe(uglify()) 
      .pipe(concat(key + '.js')) 
      .pipe(gulp.dest('public/js')); 
    }); 
}); 

ich so fühlen ist ein bisschen sauberer, weil Sie die Schleife und die Funktion an der gleichen Stelle haben, also ist es einfacher zu pflegen.

+0

) Dann können Sie mit Gulp 4 diese Tasks parallel aufrufen: gulp.parallel ("scripts: app", "scripts: vendor")! Einfach, fantastisch^^ –

+0

aber wie gehst du mit sagen 50 getrennte Aufgabe, die alle auf die gleiche Weise arbeiten müssen, würden Sie immer noch gulp.parallel verwenden? – AKFourSeven

0

cmancre Lösung funktionieren ... aber hier ist die modifizierte und eine Arbeits ich zur Zeit mit:

var jsFiles = 
{ 
    group1:[file1.js,file2.js], 
    group2:[file2.js,file3.js] 
}; 

var defaultTasks = []; 

function createTask(key) 
{ 
    gulp.task(key, function() { 
     return gulp.src(jsFiles[key]) 
      .pipe(uglify()) 
      .pipe(concat(key + '.js')) 
      .pipe(rename({suffix: ".min"})) //Will create group1.min.js 
      .pipe(gulp.dest('./assets/js')); 
    }); 
} 

for (var key in jsFiles) 
{ 
    createTask(key); 
    defaultTasks.push(key); 
} 

gulp.task('default', defaultTasks, function(){ 
    for (var key in jsFiles) 
    { 
     //Will watch each js defined in group1 or group2 
     gulp.watch(jsFiles[key], [key]) 
    } 
}); 
1

Gulp # 4.0 verwenden, ich mag die Verwendung von gulp.parallel(), wie zB:

var plugins = require('gulp-load-plugins'); 
var $ = plugins(); 

var jsFiles = { 
    // Libraries required by Foundation 
    "jquery" : [ 
     "bower_components/jquery/dist/jquery.js", 
     "bower_components/motion-ui/dist/motion-ui.js", 
     "bower_components/what-input/dist/what-input.js" 
    ], 
    "angular" : [ 
     "bower_components/angular/angular.min.js", 
     "bower_components/angular-animate/angular-animate.min.js", 
     "bower_components/angular-aria/angular-aria.min.js", 
     "bower_components/angular-material/angular-material.min.js", 
     "bower_components/angular-messages/angular-messages.min.js", 
     "bower_components/angular-sanitize/angular-sanitize.min.js", 
     "bower_components/angular-ui-i18n/angular-ui-i18n.min.js" 
    ], 
    // Core Foundation files 
    "foundation-sites" : [ 
     "bower_components/foundation-sites/dist/js/foundation.js" 
    ], 
    // Dropzone Library 
    "dropzone" : [ 
     "bower_components/dropzone/dist/dropzone.js", 
     "bower_components/ng-dropzone/dist/ng-dropzone.min.js" 
    ] 
}; 

var defaultTasks = Object.keys(jsFiles); 

defaultTasks.forEach(function (libName) { 
    gulp.task('scripts:'+libName, function() { 
     return gulp.src(jsFiles[libName]) 
     //.pipe($.jshint()) // if you want it 
     //.pipe($.uglify()) // if you like it 
     //.pipe($.concat(libName+'.js')) // .min.js if you Uglified it 
     .pipe(gulp.dest('dist/lib/'+libName)); 
    }); 
}); 

gulp.task('bundle_javascript_dependencies', 
    gulp.parallel(
     defaultTasks.map(function(name) { return 'scripts:'+name; }) 
    ) 
); 

gulp.task('build', 
    gulp.series(
     'clean', 
     gulp.parallel(/* Any other task of function */ 'bundle_javascript_dependencies') 
    ) 
); 

Arbeiten für mich und ich liebe es! Danke an OverZealous, mir den Weg gezeigt zu haben.