Сегодня утром скрипт сборки gulp начал сбой; кроме обычной работы в каталоге проекта, я не внес никаких изменений в свою систему.Задачи gulp не работают с ошибками EEXIST
У меня есть каталог/src с различными фрагментами HTML, изображениями, javascript, LESS, и я использую gulp для компиляции/конкатенации/копирования и размещения их в каталоге/web. Задача «по умолчанию» запускает задачу «build», которая вызывает все остальные задачи, а затем gulp.watch настроен на просмотр каталогов для изменений и запуск соответствующей задачи - это изменение.
В начале каждой задачи я использую del() для очистки папки назначения. Однако, когда приходит время разместить содержимое в папке назначения, задача выходит из строя с ошибкой «EEXIST», или задача завершается нормально, а некоторые из файлов случайно отсутствуют в выходном каталоге.
Вот моя командная строка, которая показывает задачи неудачи в случайном порядке:
> user$ gulp
[11:58:02] Using gulpfile PROJECTPATH/gulpfile.js
[11:58:02] Starting 'styles'...
[11:58:02] Starting 'scripts'...
[11:58:02] Starting 'images'...
[11:58:02] Starting 'fonts'...
[11:58:02] Starting 'html'...
[11:58:03] Finished 'styles' after 726 ms
[11:58:03] gulp-imagemin: Minified 1 image (saved 7.38 kB - 10.4%)
[11:58:03] Finished 'fonts' after 714 ms
[11:58:03] Finished 'images' after 722 ms
[11:58:03] Finished 'scripts' after 741 ms
[11:58:03] Finished 'html' after 737 ms
[11:58:03] Starting 'build'...
[11:58:03] Finished 'build' after 9.61 μs
[11:58:03] Starting 'default'...
[11:58:03] Finished 'default' after 125 ms
> user$ gulp
[11:58:22] Using gulpfile PROJECTPATH/gulpfile.js
[11:58:22] Starting 'styles'...
[11:58:22] Starting 'scripts'...
[11:58:22] Starting 'images'...
[11:58:22] Starting 'fonts'...
[11:58:22] Starting 'html'...
[11:58:22] 'scripts' errored after 86 ms
[11:58:22] Error: EEXIST, mkdir 'PROJECTPATH/web/project_files/js'
[11:58:22] 'fonts' errored after 74 ms
[11:58:22] Error: ENOENT, open 'PROJECTPATH/web/project_files/fonts/glyphicons-halflings-regular.eot'
[11:58:23] 'html' errored after 144 ms
[11:58:23] Error: EEXIST, mkdir 'PROJECTPATH/web/project_files/templates/instruction'
[11:58:23] Finished 'styles' after 728 ms
[11:58:23] gulp-imagemin: Minified 1 image (saved 7.38 kB - 10.4%)
[11:58:23] Finished 'images' after 736 ms
> user$ gulp
[11:58:28] Using gulpfile PROJECTPATH/gulpfile.js
[11:58:28] Starting 'styles'...
[11:58:28] Starting 'scripts'...
[11:58:28] Starting 'images'...
[11:58:28] Starting 'fonts'...
[11:58:28] Starting 'html'...
[11:58:28] Finished 'styles' after 729 ms
[11:58:28] Finished 'fonts' after 707 ms
[11:58:28] Finished 'scripts' after 737 ms
[11:58:28] gulp-imagemin: Minified 1 image (saved 7.38 kB - 10.4%)
[11:58:28] Finished 'images' after 733 ms
[11:58:28] Finished 'html' after 740 ms
[11:58:28] Starting 'build'...
[11:58:28] Finished 'build' after 9.73 μs
[11:58:28] Starting 'default'...
[11:58:28] Finished 'default' after 120 ms
> user$ gulp
[11:58:34] Using gulpfile PROJECTPATH/gulpfile.js
[11:58:34] Starting 'styles'...
[11:58:34] Starting 'scripts'...
[11:58:34] Starting 'images'...
[11:58:34] Starting 'fonts'...
[11:58:34] Starting 'html'...
[11:58:34] 'scripts' errored after 95 ms
[11:58:34] Error: EEXIST, mkdir 'PROJECTPATH/web/project_files/js'
[11:58:34] 'fonts' errored after 84 ms
[11:58:34] Error: ENOENT, open 'PROJECTPATH/web/project_files/fonts/glyphicons-halflings-regular.eot'
[11:58:34] 'html' errored after 143 ms
[11:58:34] Error: EEXIST, mkdir 'PROJECTPATH/web/project_files/templates/instruction'
[11:58:35] Finished 'styles' after 737 ms
[11:58:35] gulp-imagemin: Minified 1 image (saved 7.38 kB - 10.4%)
[11:58:35] Finished 'images' after 742 ms
Вот файл глотка я использую:
var gulp = require('gulp'),
less = require('gulp-less'),
autoprefixer = require('gulp-autoprefixer'),
minifycss = require('gulp-minify-css'),
jshint = require('gulp-jshint'),
uglify = require('gulp-uglify'),
imagemin = require('gulp-imagemin'),
rename = require('gulp-rename'),
concat = require('gulp-concat'),
fileinclude = require('gulp-file-include'),
cache = require('gulp-cache'),
gutil = require('gulp-util'),
rename = require('gulp-rename'),
merge = require('merge-stream'),
del = require('del'),
libraries = [
'src/js/jquery-*.js',
'src/js/bootstrap/transition.js',
'src/js/bootstrap/collapse.js',
'src/js/bootstrap/modal.js',
'src/js/bootstrap/affix.js',
'src/js/bootstrap-datepicker.js',
'src/js/bootbox.js',
'src/js/chosen.jquery.js',
'src/js/underscore.js',
'src/js/sha1.js',
'src/js/DeviceIdConverter.js',
'src/js/custom.js'
],
ieLibraries = [
'src/js/html5shiv.js',
'src/js/respond.js'
],
appConfig = [
'src/js/country.json',
'src/js/locations.json',
'src/js/make_model.json',
'src/js/project.js'
];
gulp.task('styles', function() {
del(['web/project_files/css']);
return gulp.src('src/less/project.less')
.pipe(less())
.pipe(gulp.dest('web/project_files/css'))
});
gulp.task('scripts', function() {
del(['web/project_files/js']);
var libraryStream = gulp.src(libraries)
.pipe(concat('libraries.js')),
ieLibraryStream = gulp.src(ieLibraries)
.pipe(concat('ie8.js')),
appConfigStream = gulp.src(appConfig)
.pipe(rename(function(path) {
path.extname = '.js';
}));
return merge(libraryStream, ieLibraryStream, appConfigStream)
.pipe(gulp.dest('web/project_files/js'));
});
gulp.task('images', function() {
del(['web/project_files/img']);
return gulp.src('src/img/**/*.+(jpg|png)')
.pipe(imagemin({optimizationLevel: 3, progressive: true, interlaced: true }))
.pipe(gulp.dest('web/project_files/img'))
});
gulp.task('fonts', function() {
del(['web/project_files/fonts']);
return gulp.src('src/fonts/**/*.+(eot|svg|ttf|woff|otf)')
.pipe(rename(function(path) {
path.dirname = '';
}))
.pipe(gulp.dest('web/project_files/fonts'));
});
gulp.task('html', function() {
del(['web/project.htm']);
del(['web/project_files/templates']);
var htmlStream = gulp.src('src/html/index.html')
.pipe(fileinclude())
.pipe(rename('project.htm'));
var templateStream = gulp.src('src/html/templates/**/*.html')
.pipe(rename(function(path) {
path.dirname = "/project_files/templates/"+path.dirname;
path.extname = ".tpl";
}));
return(merge(htmlStream, templateStream))
.pipe(gulp.dest('web'));
});
gulp.task('build', ['styles', 'scripts', 'images', 'fonts', 'html'], function() {
});
gulp.task('default', ['build'], function() {
gulp.watch('src/html/**/*.html', ['html']);
gulp.watch('src/less/**/*.less', ['styles']);
gulp.watch('src/js/**/*.js', ['scripts']);
gulp.watch('src/img/**/*.+(jpg|png)', ['images']);
gulp.watch('src/fonts/**/*.+(eot|svg|ttf|woff|otf)', ['fonts']);
});
говорит сообщение об ошибке место назначения существует, но не следует ли del() удалять целевой каталог в начале каждой дочерней задачи?
UPDATE:
Вот как я структурировать мои задачи сейчас, что, кажется, работает быстро и правильно:
gulp.task('scripts', function() {
del(['web/js'], function(err) {
if (err) return;
return gulp.src('src/js/**/*.js')
.pipe(concat('mything.js'))
.pipe(gulp.dest('web/js'));
});
});
спасибо: за некоторое время, я просто переключился дель() в del.sync(), но через некоторое время, я заметил, что это было довольно бит медленнее, чем асинхронная версия. Итак, я реструктурировал задачи для запуска как обратные вызовы, вроде вашего примера, и теперь все кажется хорошо добавленным к оригинальному сообщению. – Zarathustra
В качестве альтернативы вы можете просто «вернуть del (['something/**'])". Это возвращает обещание для действия удаления, и Gulp, похоже, правильно координируется, если у него есть обещание. –