Может ли 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()
, чтобы это сделать?
Ответы
Ответ 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"));
Вот так, я использую этот подход на каждом из моих проектов.