Gulp зависает после "Finishing"

Я новичок в node и развивается в любой "правильной" среде. Я установил gulp для моего текущего проекта, а также мокко и несколько других модулей. Вот мой gulpfile.js:

var gulp = require('gulp');
var mocha = require('gulp-mocha');
var eslint = require('gulp-eslint');

gulp.task('lint', function () {
    return gulp.src(['js/**/*.js'])
        // eslint() attaches the lint output to the eslint property 
        // of the file object so it can be used by other modules. 
        .pipe(eslint())
        // eslint.format() outputs the lint results to the console. 
        // Alternatively use eslint.formatEach() (see Docs). 
        .pipe(eslint.format())
        // To have the process exit with an error code (1) on 
        // lint error, return the stream and pipe to failOnError last. 
        .pipe(eslint.failOnError());
});

gulp.task('test', function () {
    return gulp.src('tests/test.js', {read: false})
        // gulp-mocha needs filepaths so you can't have any plugins before it 
        .pipe(mocha({reporter: 'list'}));
});

gulp.task('default', ['lint','test'], function () {
    // This will only run if the lint task is successful...
});

Когда я запускаю 'gulp', он, похоже, выполняет все свои задачи, но зависает. Мне нужно ctrl + c, чтобы вернуться в командную строку. Как я могу закончить его правильно?

Ответ 1

Извиняйтесь, ребята! Оказывается, что это описано в gulp -mocha часто задаваемых вопросах. Цитировать:

Набор тестов не выходит

Если ваш тестовый пакет не выходит, это может быть связано с тем, что у вас все еще есть затяжной обратный вызов, чаще всего вызванный открытой базой данных подключение. Вы должны закрыть это соединение или сделать следующее:

gulp.task('default', function () {
    return gulp.src('test.js')
        .pipe(mocha())
        .once('error', function () {
            process.exit(1);
        })
        .once('end', function () {
            process.exit();
        });
});

Ответ 2

Если после gulp-mocha ничего не работает, принятое решение будет работать для вас. Однако, если вам нужно запускать задачи после gulp-mocha (например, запускать тесты mocha перед развертыванием сборки), вот решение, которое предотвратит вешание gulp, все еще позволяя запускать задачи после gulp-mocha:

gulp.on('stop', () => { process.exit(0); });
gulp.on('err', () => { process.exit(1); });

Это работает, потому что gulp наследует от orchestrator который выдает события после выполнения всех задач до завершения или ошибки соответственно.

Ответ 3

Добавить оператор return внутри задачи gulp. Или запустите обратный вызов.

gulp.task('default', ['lint','test'], function (next) {
    // This will only run if the lint task is successful...
    next();
});

Ответ 4

После обновления до mocha 4 я смог решить это, передав --exit в mocha.

Подробнее см. https://boneskull.com/mocha-v4-nears-release/#mochawontforceexit.

При использовании gulp -mocha добавьте параметр как exit: true, как в:

gulp.task('test', function () {
  return gulp.src(['tests/**/*.spec.js'], {read: false})
  .pipe(mocha({ exit: true }));
});