javascript - 为什么这个 gulp 任务没有连续运行?

标签 javascript gulp

我有三个 gulp 任务:watchbuildtest。我想让我的 watch 运行,当保存文件时,它会被构建然后测试(废话)。

发生的情况是,尽管设置为运行 build 作为 test 的依赖项,但我需要保存文件两次才能生成最新版本被测试的那个。

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

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

规范文件不受此影响,因为它们不是构建的,而是直接使用的(某种程度上,它们首先被转译)。

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

日志表明情况是这样的:

[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 应用程序的基本构建,这里没什么奇怪的。

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,然后函数使用该 JSON 来创建 gulp 任务。下面的输出是那一代的结果,但我不确定像这样物理地写出每个任务会有什么不同。

您可以尝试或查看更多 here .

最佳答案

在任务“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))
});

关于javascript - 为什么这个 gulp 任务没有连续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39580593/

相关文章:

javascript - 如何使用 react-router-dom 重定向

javascript - YouTube 数据 API 表示我闲置几个小时后已超出每日使用限制

javascript - 如何使用 FormData API 发出 POST 请求

css - node.js、css 验证、w3c 禁止我?

javascript - Gulp 没有覆盖目标文件

node.js - 永远运行 Gulp 脚本?

gulp - 仅包含如果存在

javascript - 初学者 Node.JS net.createServer 示例

javascript - 如何为 Dojo 对话运行 onLoad 事件?

javascript - 事件.js : 141 throw er;//Unhandled 'error' event