为什么这个gulp任务不能连续运行?

时间:2016-09-19 19:22:57

标签: javascript gulp

我有三个gulp任务:watchbuildtest。我希望我的手表能够运行,当文件保存时,它会被构建然后进行测试(呃)。

正在发生的事情是,尽管设置为build作为test的依赖项运行,但我需要将文件保存两次,以使最新版本成为测试版本。

我可以通过启动监视器来重现这一点,在客户端JS代码中进行某些更改(例如添加控制台日志),然后观察结果输出。第一次保存将没有任何控制台输出。只需再次保存文件(不做任何更改)将导致重新运行测试并显示控制台输出。

我还注意到第一个构建+测试周期将是正确构建的情况(即将具有控制台日志语句),但在此之后,需要两次保存以确保最新代码是正在测试的代码。

规范文件不受此限制,因为它们不是构建的,而是直接使用(sorta,它们首先被编译)。

所以,我在这里疯了吗?这些应该连续运行,对吧?

日志表明情况如此:

[12:05:54] Starting 'build:client:js'...
[12:05:54] Finished 'build:client:js' after 13 ms
[12:05:54] Starting 'test:client'...
19 09 2016 12:05:54.808:INFO [karma]: Karma v1.3.0 server started at http://localhost:9876/
19 09 2016 12:05:54.808:INFO [launcher]: Launching browser PhantomJS with unlimited concurrency
19 09 2016 12:05:54.841:INFO [launcher]: Starting browser PhantomJS
19 09 2016 12:05:55.381:INFO [PhantomJS 2.1.1 (Mac OS X 0.0.0)]: Connected on socket /#Zklau3qmk75NKg2HAAAB with id 61545463
LOG: 'test'
.
PhantomJS 2.1.1 (Mac OS X 0.0.0): Executed 1 of 1 SUCCESS (0.002 secs / 0.029 secs)
[12:05:55] Finished 'test:client' after 775 ms

构建

AngularJS App的基本版本,这里没什么奇怪的。

gulp.task('build:client:js', () => {
    gulp.src('app/sections/client/**/!(*.spec|*.e2e).js')
        .pipe(sourceMaps.init())
            .pipe(eslint())
            .pipe(eslint.formatEach())
            .pipe(babel({presets: ['es2015']}))
            .pipe(ngAnnotate())
            .pipe(concat('client.js'))
            .pipe(uglify())
        .pipe(sourceMaps.write())
        .pipe(gulp.dest(paths.build))
});

测试:

这是设置好的,理想情况下,build首先运行并完成

gulp.task('test:client', ['build:client:js'], (done) => {
    const src = {};
    src['client'] = 'app/sections/client';

    const config = getTestConfig(src);
    new karmaServer(config, done).start();
});

观看:

这应该只需要运行test,因为buildtest的依赖关系。

gulp.task('watch:client:js', () => {
    gulp.watch('app/sections/client/**/*.js', ['test:client']);
});

此外,为了完全透明,我的大多数watch>build>test gulp任务都是根据路径文件动态生成的。它基本上返回JSON,然后由函数用来创建gulp任务。下面的输出是这一代的结果,但是我不确定像这样在物理上写下每个任务会有什么不同。

您可以试用或查看更多here

1 个答案:

答案 0 :(得分:1)

在任务'build:client:js'中,您应该返回流,以便gulp知道任务何时实际结束。

gulp.task('build:client:js', () => {
    return gulp.src('app/sections/client/**/!(*.spec|*.e2e).js')
        .pipe(sourceMaps.init())
            .pipe(eslint())
            .pipe(eslint.formatEach())
            .pipe(babel({presets: ['es2015']}))
            .pipe(ngAnnotate())
            .pipe(concat('client.js'))
            .pipe(uglify())
        .pipe(sourceMaps.write())
        .pipe(gulp.dest(paths.build))
});