我有三个gulp任务:watch
,build
,test
。我希望我的手表能够运行,当文件保存时,它会被构建然后进行测试(呃)。
正在发生的事情是,尽管设置为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
,因为build
是test
的依赖关系。
gulp.task('watch:client:js', () => {
gulp.watch('app/sections/client/**/*.js', ['test:client']);
});
此外,为了完全透明,我的大多数watch>build>test
gulp任务都是根据路径文件动态生成的。它基本上返回JSON,然后由函数用来创建gulp任务。下面的输出是这一代的结果,但是我不确定像这样在物理上写下每个任务会有什么不同。
您可以试用或查看更多here。
答案 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))
});