Gulp 将 运行 宁 运行 序列到任务列表末尾时发生的错误推迟

Gulp postpone error occurring whilst running run-sequence to end of tasks list

我有一个 Gulp 文件用于 Laravel 应用程序。应用程序的单元测试通过 Gulp 执行。要正确执行测试,以下任务应 运行 同步顺序(通过 运行-sequence)。

这工作正常,但是,当 PHPUnit 执行并且一个或多个单元测试失败时出现问题。如果发生这种情况,序列将被破坏,因此不会切换回原始环境,我们将停留在测试环境。

这就是为什么我想将 PHPUnit 错误推迟到序列的末尾。这样环境就恢复了,但是出于 CI 的目的,构建仍将被标记为失败。

我自己尝试过 gulp-if 和 gulp-fail。 gulp-失败代码被执行,但 运行-序列仍然继续执行。我不知道如何解决这个问题。

这是我尝试捕捉单元测试失败的方法:

.on('error', function() {
       didTestsFail = true;
       this.emit('end');
   })

对于这个任务,我试图将构建标记为失败:

gulp.task('error-when-tests-failed', function() {
    return gulp.src('./')
        .pipe(gulpIf(didTestsFail, fail()));
});

基本上,我使用全局变量来确定单元测试是否失败。

这是完整的 Gulpfile:

var gulp = require('gulp'),
    del = require('del'),
    rename = require('gulp-rename'),
    exec = require('gulp-exec'),
    foreach = require('gulp-foreach'),
    gulpSequence = require('gulp-sequence').use(gulp),
    plumber = require('gulp-plumber'),
    phpunit = require('gulp-phpunit'),
    fail   = require('gulp-fail'),
    gulpIf = require('gulp-if'),
    db = require('gulp-db')({
        user: 'user',
        password: 'some_password',
        host: 'some_host',
        port: 'some_port',
        dialect: 'mysql'
    }),

    didTestsFail = false;

gulp.task('tests', function(cb) {
    gulpSequence(
        'back-up-active-env',
        'switch-testing-env',
        'create-test-database',
        'migrate',
        'phpunit',
        'drop-test-database',
        'restore-active-env',
        'error-when-tests-failed'
    )(cb);
});

gulp.task('phpunit', function(done) {
    var options = {
        debug: false,
        statusLine: true
    };

    return gulp.src('phpunit.xml')
               .pipe(plumber())
               .pipe(phpunit('./vendor/bin/phpunit', options))
               .on('error', function() {
                   didTestsFail = true;
                   this.emit('end');
               });
});

gulp.task('back-up-active-env', function() {
    del('env.temp');
    return gulp.src('.env')
        .pipe(plumber())
        .pipe(rename('.env.temp'))
        .pipe(gulp.dest('./'));
});

gulp.task('migrate', function() {
    return gulp.src('./')
        .pipe(plumber())
        .pipe(exec('php artisan migrate'));
});

gulp.task('switch-testing-env', function() {
    del('.env');
    return gulp.src('.env.testing')
        .pipe(plumber())
        .pipe(rename('.env'))
        .pipe(gulp.dest('./'))
        .pipe(exec('php artisan config:cache'));
});

gulp.task('restore-active-env', function() {
    del('.env');
    return gulp.src('.env.temp')
        .pipe(plumber())
        .pipe(rename('.env'))
        .pipe(gulp.dest('./'))
        .pipe(exec('php artisan config:cache'));
});

gulp.task('error-when-tests-failed', function() {
    return gulp.src('./')
        .pipe(gulpIf(didTestsFail, fail()));
});

gulp.task('create-test-database', db.create('test_db'));;
gulp.task('drop-test-database', db.drop('test_db'));

经过一番摆弄后,我想出了如何让它工作:

不需要 error-when-tests-failed 任务,反正有点乱。

您可以将回调传递给 gulpSequence 函数,在此回调中您可以检查 didTestsFail var 是否为真,如果是则可以抛出错误。代码如下所示:

gulp.task('tests', function(done) {
    gulpSequence(
        'back-up-active-env',
        'switch-testing-env',
        'create-old-test-database',
        'create-new-test-database',
        'migrate',
        'phpunit',
        'drop-old-test-database',
        'drop-new-test-database',
        'restore-active-env',
        function() {
            if (didTestsFail) {
                throw new Error('One or more unit tests failed!');
            }
            done();
        }
    );
});