Почему Gulp случайно не работает с ошибкой ENOENT (или), неспособной генерировать вывод (или случайно удаленный)?
Программная среда
Я использую NodeJS v4.2.1 в Windows.
Я включил файлы gulpfile.js
, bower.json
и package.json
внизу.
Дополнительная информация
- На данный момент у меня нет IDE. Таким образом, определенно не проблема с файлами, заблокированными внешней программой.
- Я запускаю все в командной строке.
Вопрос
- Что-то не так с моим
gulpfile.js
?
- Это ошибка с
NodeJS v4.2.1
?
- Это ошибка с Gulp?
Проблема
У меня возникают эти две проблемы, когда я запускаю gulp
в командной строке.
Проблема №1
Моя папка build
не будет создаваться каждый раз, когда я запустил gulp
.
Когда я запускаю его в первый раз, он создает папку build
с артефактами вывода copy-bower
Gulp.
Когда я запустил его еще раз после него, папка build
не будет создана.
Консольный вывод Gulp ясно показывает, что моя задача copy-bower
выполнена после задачи clean
, но я не вижу созданную папку build
.
[21:21:32] Using gulpfile
[21:21:32] Starting 'clean'...
[21:21:32] Finished 'clean' after 3.66
[21:21:32] Starting 'copy-bower'...
[21:21:32] Finished 'copy-bower' after
[21:21:32] Starting 'default'...
[21:21:32] Finished 'default' after 6.
Directory: C:\Users\stun\Desktop\test-app
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 10/22/2015 9:00 PM bower_components
d----- 10/22/2015 8:59 PM node_modules
-a---- 10/22/2015 9:30 PM 347 bower.json
-a---- 10/22/2015 9:31 PM 421 gulpfile.js
-a---- 10/22/2015 9:30 PM 301 package.json
Проблема № 2
Время от времени я получаю либо одну из этих ошибок.
events.js:141
throw er; // Unhandled 'error' event
^
Error: ENOENT: no such file or directory, chmod 'C:\Users\stun\Desktop\test-app\build\bower_components\jquery\dist\jquery.min.map'
at Error (native)
Другая ошибка
events.js:141
throw er; // Unhandled 'error' event
^
Error: ENOENT: no such file or directory, stat 'C:\Users\stun\Desktop\test-app\build\bower_components\bootstrap\dist\fonts'
at Error (native)
gulpfile.js
var gulp = require('gulp'),
del = require('del');
gulp.task('clean', function () {
del(['build']);
});
gulp.task('copy-bower', ['clean'], function () {
var src = [
'./bower_components/bootstrap/dist/**',
'./bower_components/jquery/dist/*'
];
gulp.src(src, { base: '.' })
.pipe(gulp.dest('./build/'));
});
gulp.task('default', ['copy-bower'], function () { });
bower.json
{
"name": "test-app",
"description": "testing gulp and bower",
"main": "",
"moduleType": [],
"authors": [""],
"license": "MIT",
"homepage": "",
"private": true,
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": {
"bootstrap": "~3.3.5"
}
}
package.json
{
"name": "test-app",
"version": "1.0.0",
"description": "testing gulp and bower",
"main": "",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"del": "^2.0.2",
"gulp": "^3.9.0"
}
}
Ответы
Ответ 1
Ваши задачи ничего не возвращают или не вызывают никаких обратных вызовов, поэтому Gulp считает, что ваши задачи выполняются немедленно. В частности, он не будет ждать, пока ваша задача clean
завершит свою работу, прежде чем приступать к копированию файлов bower. Эти два могут столкнуться и привести к ошибкам файловой системы.
Измените код следующим образом:
var gulp = require('gulp'),
del = require('del');
gulp.task('clean', function () {
// Return the promise that del produces.
return del(['build']);
});
gulp.task('copy-bower', ['clean'], function () {
var src = [
'./bower_components/bootstrap/dist/**',
'./bower_components/jquery/dist/*'
];
// Return your stream.
return gulp.src(src, { base: '.' })
.pipe(gulp.dest('./build/'));
});
gulp.task('default', ['copy-bower'], function () { });
Ответ 2
Если на выходе показано, что одна задача запускается до того, как предыдущий закончен (особенно "чистый" ), как это (см. "build", начиная с "clean" ):
[08:32:07] Using gulpfile ~/project/gulpfile.js
[08:32:07] Starting 'clean'...
[08:32:07] Starting 'build'...
[08:32:07] Finished 'clean' after 14 ms
[08:32:07] Finished 'build' after 15.53 ms
Используйте эти методы, чтобы исправить это:
Техника 1 - вернуть обещание
Как писал @Louis, сделайте следующее:
del = require('del');
gulp.task('clean', function () {
del(['build']);
});
в это:
del = require('del');
gulp.task('clean', function () {
return del(['build']); // see "return"
});
Техника 2 - зависимость задачи
сделайте следующее:
gulp.task('build', function () {
// some code...
});
:
gulp.task('build', ['clean'], function () { // see 'clean' as dependency
// some code...
});
Техника 3 - упорядочение задач
сделайте следующее:
gulp.task('default', ['build', 'serve', 'watch']);
в это:
gulp.task('default', ['build'], function () {
gulp.start(['serve', 'watch']); // starts only after 'build'
});
Ответ 3
К сожалению, я нахожу, что этот вопрос все еще происходит. Решение esiest (для меня) - использовать run-sequence:
var runSequence = require('run-sequence');
gulp.task('some-task', function() {
runSequence(
['task-1', 'task-2', 'task-3'], // These 3 can be done in parallel
'task-4', // ...then just do this
['task-5', 'task-5'], // ...then do these things in parallel
'task-6', // ...then do this
// ....
);
});
найдено: https://davidwalsh.name/gulp-run-sequence