#node.js #gulp
#node.js #gulp
Вопрос:
У меня минимальный опыт работы с Node.js проекты и унаследовали тот, который использует Gulp для создания и распространения самого себя.
В проекте есть несколько разрозненных файлов задач, и a gulpfile.js
, который ссылается на них все. Для краткости я буду использовать наименьшую функцию в качестве примера.
//gulpfile.js
...
gulp.task('csscompile', function() {
gulp.src('./src/ops/gulp/csscompile.js')
});
...
//csscompile.js
...
module.exports = function (gulp) {
gulp.task('csscompile', function (done) {
let paths = [
'src/app/**/*.scss',
'node_modules/angular-material/angular-material.scss',
];
gulp.src(paths)
.pipe(sass())
.pipe(concat('app.css'))
.pipe(gulp.dest('build'))
.done();
});
};
Запуск $ gulp csscompile
из командной строки всегда завершает всю функцию примерно за 10 мс, и я получаю вывод, подобный:
[10:44:43] The following tasks did not complete: csscompile
[10:44:43] Did you forget to signal async completion?
Очевидно, что существует проблема с ожиданием завершения функций. После поиска я перепробовал все мыслимые комбинации использования async
флагов, использования function (done)
и многого другого, но безрезультатно. Даже помещение csscompile
функции непосредственно в csscompile
задачу не работает.
Я предполагаю, что использование gulp.src()
является частью проблемы, я не знаю, встроены ли эти функции или что. Я также хочу избежать необходимости превращать каждую из этих функций в Promise
.
Есть ли у кого-нибудь какие-либо рекомендации по изменениям, которые я могу внести?
Комментарии:
1. Вы тоже ввели возврат в
gulp.task('csscompile', function() { return gulp.src('./src/ops/gulp/csscompile.js') });
функцию? Это может быть проблемой.
Ответ №1:
Согласно документам:
Когда вы видите сообщение «Вы забыли сообщить об асинхронном завершении?» предупреждение, ни один из методов, упомянутых выше, не использовался. Для решения проблемы вам нужно будет использовать обратный вызов с ошибкой или вернуть поток, обещание, отправитель события, дочерний процесс или наблюдаемый.
Итак, вам нужно вернуть поток.
Это должно сработать:
module.exports = function (gulp) {
gulp.task('csscompile', function () {
let paths = [
'src/app/**/*.scss',
'node_modules/angular-material/angular-material.scss',
];
return gulp.src(paths)
.pipe(sass())
.pipe(concat('app.css'))
.pipe(gulp.dest('build'));
});
Комментарии:
1. Спасибо за эту ссылку. Я попробовал ваше предложение вернуть поток, но я все еще получаю сообщение «Вы забыли …?». Может ли это быть проблемой с тем, как я определяю задачу в
gulpfile.js
?2. Да, это так. На данный момент это путь в никуда. Позвольте мне погуглить.
3. Какую версию gulp вы используете?
4. v4.0.2. Из того, что я могу сказать, все это было построено ~ v3.9.
5. Между Gulp 3 и 4 произошли критические изменения, требующие изменений: joezimjs.com/javascript/complete-guide-upgrading-gulp-4 Вам придется использовать Gulp 3 или переписать, чтобы использовать Gulp 4.