Gulp 将 运行 宁 运行 序列到任务列表末尾时发生的错误推迟
Gulp postpone error occurring whilst running run-sequence to end of tasks list
我有一个 Gulp 文件用于 Laravel 应用程序。应用程序的单元测试通过 Gulp 执行。要正确执行测试,以下任务应 运行 同步顺序(通过 运行-sequence)。
- 备份当前.env文件
- 将 .env.testing 设置为当前 .env 文件
- 创建单元测试将使用的数据库
- 运行 迁移
- 执行单元测试
- 删除测试数据库
- 恢复我们一开始做的.env文件的备份
这工作正常,但是,当 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();
}
);
});
我有一个 Gulp 文件用于 Laravel 应用程序。应用程序的单元测试通过 Gulp 执行。要正确执行测试,以下任务应 运行 同步顺序(通过 运行-sequence)。
- 备份当前.env文件
- 将 .env.testing 设置为当前 .env 文件
- 创建单元测试将使用的数据库
- 运行 迁移
- 执行单元测试
- 删除测试数据库
- 恢复我们一开始做的.env文件的备份
这工作正常,但是,当 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();
}
);
});