Gulp任务没有完成

时间:2016-01-09 12:41:16

标签: typescript gulp

运行gulp默认任务时,其中一个构建任务无法完成。它似乎取决于它们被调用的顺序。这是脚本。

var gulp = require('gulp');
var del = require('del');
var ts = require('gulp-typescript');
var concat = require('gulp-concat');

var tsProject = ts.createProject('tsconfig.json');

gulp.task('clean', function () {
    return del(['dist']);
});

gulp.task('buildCommon', function () {
    return gulp.src('src/common/**/*.ts')
        .pipe(ts(tsProject))
        .pipe(concat('common.min.js'))
        .pipe(gulp.dest('dist/server'))
        .pipe(gulp.dest('dist/client'));
});

gulp.task('buildServer', function () {
    return gulp.src('src/server/**/*.ts')
        .pipe(ts(tsProject))
        .pipe(concat('server.min.js'))
        .pipe(gulp.dest('dist/server'));
});

gulp.task('build', ['clean'], function () {
    gulp.start('buildCommon');
    gulp.start('buildServer');
});

运行以下结果。

c:\development\git\fsts>gulp build
[06:31:19] Using gulpfile c:\development\git\fsts\gulpfile.js
[06:31:19] Starting 'clean'...
[06:31:19] Finished 'clean' after 10 ms
[06:31:19] Starting 'build'...
[06:31:19] Starting 'buildCommon'...
[06:31:19] Starting 'buildServer'...
[06:31:19] Finished 'build' after 15 ms
[06:31:20] Finished 'buildServer' after 1.18 s

您应该注意到buildCommon没有完成。

如果我单独运行buildGemon或buildServer任务,它们就可以运行。

c:\development\git\fsts>gulp buildServer
[06:34:00] Using gulpfile c:\development\git\fsts\gulpfile.js
[06:34:00] Starting 'buildServer'...
[06:34:01] Finished 'buildServer' after 783 ms

c:\development\git\fsts>gulp buildCommon
[06:34:31] Using gulpfile c:\development\git\fsts\gulpfile.js
[06:34:31] Starting 'buildCommon'...
[06:34:31] Finished 'buildCommon' after 761 ms

这是另一个奇怪的部分。如果我更改了启动调用的顺序,则buildServer无法完成。

gulp.task('build', ['clean'], function () {
    gulp.start('buildServer');
    gulp.start('buildCommon');
});

c:\development\git\fsts>gulp build
[06:39:20] Using gulpfile c:\development\git\fsts\gulpfile.js
[06:39:20] Starting 'clean'...
[06:39:20] Finished 'clean' after 9.86 ms
[06:39:20] Starting 'build'...
[06:39:20] Starting 'buildServer'...
[06:39:20] Starting 'buildCommon'...
[06:39:20] Finished 'build' after 16 ms
[06:39:21] Finished 'buildCommon' after 1.18 s

任何想法为什么两个独立的任务与他们自己的流不会让他们中的一个完成?

更新:尝试使用合并流和单个任务,它仍然具有相同的行为。

更新!我的下一步是尝试合并流,只使用一个任务,但我得到了类似的结果。

var gulp = require('gulp');
var del = require('del');
var ts = require('gulp-typescript');
var concat = require('gulp-concat');
var merge = require('merge-stream');

var tsProject = ts.createProject('tsconfig.json');

gulp.task('clean', function () {
    return del(['dist']);
});

gulp.task('build', ['clean'], function () {

    var serverStream = gulp.src('src/server/**/*.ts')
        .pipe(ts(tsProject))
        .pipe(concat('server.js'))
        .pipe(gulp.dest('dist/server'));

    var commonStream = gulp.src('src/common/**/*.ts')
        .pipe(ts(tsProject))
        .pipe(concat('common.js'))
        .pipe(gulp.dest('dist/server'))
        .pipe(gulp.dest('dist/client'));

    var merged = merge(commonStream, serverStream);
    return merged;
});

gulp.task('default', ['build']);

结果看起来像构建任务没有完成。

c:\development\git\fsts>gulp
[06:58:00] Using gulpfile c:\development\git\fsts\gulpfile.js
[06:58:00] Starting 'clean'...
[06:58:00] Finished 'clean' after 9.9 ms
[06:58:00] Starting 'build'...

1 个答案:

答案 0 :(得分:1)

根据链接https://github.com/gulpjs/gulp/issues/426,建议不要在构建文件中使用 gulp.start ,这会导致复杂的构建文件。

我会建议run-sequence对您的任务进行一次排序,然后我进行测试以确定其工作正常。您遇到的问题实际上是,typescript编译器无法并行运行两个实例,并且对它创建的中间输出文件存在争用。

var gulp = require('gulp');
var del = require('del');
var ts = require('gulp-typescript');
var concat = require('gulp-concat');
var runsequence = require('run-sequence');

var tsProject = ts.createProject('tsconfig.json');

gulp.task('clean', function () {
    return del(['dist']);
});

gulp.task('buildCommon', function () {
    return gulp.src('src/common/**/*.ts')
        .pipe(ts(tsProject))
        .pipe(concat('common.min.js'))
        .pipe(gulp.dest('dist/server'))
        .pipe(gulp.dest('dist/client'));
});

gulp.task('buildServer', function () {
    return gulp.src('src/server/**/*.ts')
        .pipe(ts(tsProject))
        .pipe(concat('server.min.js'))
        .pipe(gulp.dest('dist/server'));
});

gulp.task('build', ['clean'], function (done) {
     runsequence('buildCommon', 'buildServer', done);    
});