Пропустить удаление уже сжатых файлов с 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'));
});
Другие вопросы по тегам