Подтвердить что ты не робот

Может ли Gulp перезаписать все файлы src?

Скажем, я хочу заменить номер версии в кучу файлов, многие из которых живут в подкаталогах. Я буду передавать файлы через gulp-replace для запуска функции regex-replace; но в конечном итоге я хочу перезаписать все исходные файлы.

Задача может выглядеть примерно так:

gulp.src([
    './bower.json',
    './package.json',
    './docs/content/data.yml',
    /* ...and so on... */
  ])
  .pipe(replace(/* ...replacement... */))
  .pipe(gulp.dest(/* I DONT KNOW */);

Итак, как я могу закончить его так, чтобы каждый файл src просто перезаписывал себя в исходном месте? Есть ли что-то, что я могу передать на gulp.dest(), чтобы это сделать?

4b9b3361

Ответ 1

Я могу думать о двух решениях:

  • Добавьте параметр base к вашему gulp.src так:

    gulp.src([...files...], {base: './'}).pipe(...)...
    

    Это позволит gulp сохранить весь относительный путь. Затем перейдите './' в gulp.dest(), чтобы перезаписать исходные файлы. (Примечание: это не проверено, вы должны убедиться, что у вас есть резервная копия, если она не работает.)

  • Используйте функции. gulp просто JavaScript, так что вы можете сделать это:

    [...files...].forEach(function(file) {
        var path = require('path');
        gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
    }
    

    Если вам нужно запустить эти асинхронно, первое будет намного проще, так как вам нужно будет использовать что-то вроде event-stream.merge и сопоставить потоки в массиве. Это будет выглядеть как

    var es = require('event-stream');
    
    ...
    
    var streams = [...files...].map(function(file) {
            // the same function from above, with a return
            return gulp.src(file) ...
        };
    return es.merge.apply(es, streams);
    

Ответ 2

Сообщите gulp для записи в базовый каталог рассматриваемого файла, так же:

    .pipe(
        gulp.dest(function(data){

            console.log("Writing to directory: " + data.base);
            return data.base;
        })
    )

(Аргумент данных объект винилового файла)

Преимущество такого подхода заключается в том, что если у вас есть файлы из нескольких источников, каждый из которых вложен на разные уровни файловой структуры, этот подход позволяет вам перезаписать каждый файл правильно. (Как установлено для установки одного базового каталога в верхней части вашей цепочки)

Ответ 3

если вы используете gulp-rename, вот еще одно обходное решение:

var rename = require('gulp-rename');

...

function copyFile(source, target){
  gulp.src(source)
  .pipe(rename(target))
  .pipe(gulp.dest("./"));
}

copyFile("src/js/app.js","dist/js/app.js");

и если вы хотите, чтобы источник и цель были абсолютными путями,

var rename = require('gulp-rename');

...

function copyFile(source, target){
  gulp.src(source.replace(__dirname,"."))
  .pipe(rename(target.replace(__dirname,".")))
  .pipe(gulp.dest("./"));
}

copyFile("/Users/me/Documents/Sites/app/src/js/app.js","/Users/me/Documents/Sites/app/dist/js/app.js");

Ответ 4

Я не уверен, почему люди усложняют это, но просто начав путь к месту назначения с помощью "./", он выполняет свою работу.

Скажите, что путь 'dist/css' Тогда вы бы использовали это так .pipe(gulp.dest("./dist/css"));

Вот так, я использую этот подход на каждом из моих проектов.