Search code examples
javascriptbuildgulp

Deleting files in a gulp task


I have a gulp task in which I want to take some source files and copy them to build/premium and build/free and then remove some extra files from build/free.

My attempt at that was doing this:

gulp.task("build", ["clean"], function () {
  gulp.src(["src/*", "!src/composer.*", "LICENSE"])
    .pipe(gulp.dest("build/premium"))
    .pipe(del(["build/free/plugins/*", "!build/free/plugins/index.php"]))
    .pipe(gulp.dest("build/free"));
});

Which results in an error:

TypeError: dest.on is not a function
    at DestroyableTransform.Stream.pipe (stream.js:45:8)
    at Gulp.<anonymous> (/Users/gezim/projects/myproj/gulpfile.js:9:6)

How do I accomplish this the deleting port? Is there a better way altogether to do this?


Solution

  • I would use gulp-filter to drop only what should not be copied from the 2nd destination.

    I interpreted the intent of the task as wanting everything present in src to be present in build/premium. However, build/free should exclude everything which was originally in src/plugins but should still include src/plugins/index.php.

    Here is a working gulpfile:

    var gulp = require("gulp");
    var filter = require("gulp-filter");
    var del = require("del");
    
    gulp.task("clean", function () {
      return del("build");
    });
    
    gulp.task("build", ["clean"], function () {
      return gulp.src(["src/**", "!src/composer.*", "LICENSE"])
        .pipe(gulp.dest("build/premium"))
        .pipe(filter(["**", "!plugins/**", "plugins/index.php"]))
        .pipe(gulp.dest("build/free"));
    });
    

    The patterns passed to filter are relative paths. Since the gulp.src pattern has src/** it means they are relative to src.

    Note also that del cannot be passed straight to .pipe() as it returns a promise. It can be returned from a task, like the clean task does.