Пропустить удаление уже сжатых файлов с Gulp
У меня есть ситуация, когда я в настоящее время удаляю все файлы JavaScript, даже если они уже были сжаты, что, очевидно, не очень хорошая идея.
Моя соответствующая задача была:
gulp.task('uglify', ['scripts'], function() {
return gulp.src('./js/scripts.js')
.pipe(rename({suffix: '.min'}))
.pipe(uglify({
mangle: false
}))
.pipe(gulp.dest('./js'));
});
scripts.js
был файл, который был ранее объединен вместе, но, очевидно, если там были какие-то уже сжатые файлы, то они снова будут очищены, чего мы пытаемся избежать.
Таким образом, я провел поиск и смотрел на обработку всех файлов снова, а не на отработку незавершенной (файл, который содержит только объединенные файлы) версии, чтобы у меня был больший контроль над каждым файлом.
Я смотрел на использование gulp-ignore
а также gulp-if
а также gulp-if
кажется, возможно, то, что я хочу; однако я не уверен на 100%, как работают потоки в Gulp - когда вы передаете ему список файлов, он выполняет циклическое выполнение задач для каждого файла или просто запускается один раз?
Мне любопытно, потому что, если он проходит для каждого файла, я работал над чем-то вроде этого:
gulp.task('uglify', ['scripts'], function() {
return gulp.src(js_scripts)
.pipe(gulpif(condition, uglify({mangle: false})))
.pipe(concat('scripts.min.js'))
.pipe(gulp.dest('./js'));
});
куда condition
было что-то, что проверило, был ли файл .min
в имени файла и, если так, не увеличивайте его.
Поэтому мой вопрос - если он проходит циклически, и я могу выполнить условие для каждого файла, как я могу выполнить тесты для имени файла, и если он не проходит циклически, то как я могу добиться того, что я пытаюсь сделать здесь? Буду ли я вынужден создать две отдельные задачи, одну для унифицированных и одну для .min
файлы, а затем в конце соединить их вместе?
2 ответа
С помощью ответа @lofihelsinki и комментария @mark я смог найти решение.
Несмотря на то, что это привело меня в правильном направлении, мне все же пришлось настроить некоторый код методом проб и ошибок, поэтому я не смог принять ответ, но я хотел отдать им должное, поскольку они привели меня к решению.
Окончательное решение было:
gulp.task('uglify', ['scripts'], function() {
return gulp.src(js_scripts)
.pipe(gulpif('!**/*.min.js', uglify({mangle: false})))
.pipe(concat('scripts.min.js'))
.pipe(gulp.dest('./js'));
});
Я попробовал предложение @Mark, но кажется, что, несмотря на то, что у вас есть файлы в потоке, вы все равно должны учитывать расположение папки; поэтому я должен был изменить его предложение '!*.min.js'
в '!**/*.min.js'
; теперь будут только скрипты, которые не содержат .min.js
в имени файла и те, которые делают, будут пропущены через нетронутыми.
Я думаю, что ваш пример должен сделать именно это, uglify
только файлы, которые соответствуют condition
, но передайте все файлы независимо от условия следующему оператору.
gulp.task('uglify', ['scripts'], function() {
return gulp.src(js_scripts)
.pipe(gulpif(condition, uglify({mangle: false})))
.pipe(concat('scripts.min.js'))
.pipe(gulp.dest('./js'));
});
Есть и пример на gulp-if
Страница называется 1: условно фильтровать контент, где говорится:
Только увеличивайте содержимое, если условие выполнено, но отправляйте все файлы в папку dist
Я думаю, что он отправит все файлы в поток, даже если что-то было до папки dist.
Что касается вопроса зацикливания, условие проверяется на файл в источнике, js_scripts
Вот.
РЕДАКТИРОВАТЬ: Вы можете использовать функцию условия, чтобы проверить имя файла
var condition = function (file) {
// TODO: add business logic
console.log(file.path);
return true;
}
РЕДАКТИРОВАТЬ 2
Согласно комментариям и исследованиям @mark и @Brett, вы также можете использовать Regex для исключения уже минимизированных файлов, то есть файлов с .min.js
суффикс:
gulp.task('uglify', ['scripts'], function() {
return gulp.src(js_scripts)
.pipe(gulpif('!**/*.min.js', uglify({mangle: false})))
.pipe(concat('scripts.min.js'))
.pipe(gulp.dest('./js'));
});