Javascript 依赖吞咽的任务-浏览和预浏览任务

Javascript 依赖吞咽的任务-浏览和预浏览任务,javascript,ember.js,gulp,browserify,Javascript,Ember.js,Gulp,Browserify,我有以下几点 我使用的是,它接受一个回调,在编写生成的文件(client/.index.js,在本例中为)时调用该回调。现在,browserify任务取决于该文件,因此它应该在emberate完成后才能运行。但我得到了不同的结果,有时是有效的,有时是: 错误:无法从“/Users/myuser/workspace/myproject”中找到模块“./client/.index.js” 从browserify(是的,文件还没有出现)。。我不确定我做错了什么,我已经完成了作为我的emberate任务

我有以下几点

我使用的是,它接受一个回调,在编写生成的文件(
client/.index.js,在本例中为
)时调用该回调。现在,
browserify
任务取决于该文件,因此它应该在emberate完成后才能运行。但我得到了不同的结果,有时是有效的,有时是:

错误:无法从“/Users/myuser/workspace/myproject”中找到模块“./client/.index.js”

从browserify(是的,文件还没有出现)。。我不确定我做错了什么,我已经
完成了
作为我的emberate任务中的回调,而browserify任务取决于emberate。。我错过了什么

编辑:找到一个小模式,如果我运行它并且它没有出错,下次运行
gulp
时我会得到错误,但是下次我没有,所以每隔一次o.o

如果我运行
gulpemberate
,效果很好。然后,如果我运行
gulp browserify
它将运行以下命令:

[gulp] Using file /Users/myuser/workspace/myproject/gulpfile.js
[gulp] Working directory changed to /Users/myuser/workspace/myproject
[gulp] Running 'clean'...
[gulp] Finished 'clean' in 3.11 ms
[gulp] Running 'emberate'...
[gulp] Finished 'emberate' in 22 ms
[gulp] Running 'browserify'...
[gulp] Live reload server listening on: 35729

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: Cannot find module './client/.index.js' from '/Users/myuser/workspace/myproject'
    at /Users/myuser/workspace/myproject/node_modules/browserify/node_modules/resolve/lib/async.js:36:25
    at load (/Users/myuser/workspace/myproject/node_modules/browserify/node_modules/resolve/lib/async.js:54:43)
    at /Users/myuser/workspace/myproject/node_modules/browserify/node_modules/resolve/lib/async.js:60:22
    at /Users/myuser/workspace/myproject/node_modules/browserify/node_modules/resolve/lib/async.js:16:47
    at Object.oncomplete (fs.js:107:15)

这个最新版本似乎可以工作,但在监视文件更改期间,它不会清理
client/.index.js
文件,而是不断向其添加o.o(尽管运行
gulp-emberate
,无论是否使用
clean
依赖项都可以正常工作。)

您需要给出关于如何完成每个任务的提示。看

在所有任务中,切换此选项:

gulp.task('name', function () {
  gulp.src(glob)
    .pipe(stuff());
});
为此:

gulp.task('name', function () {
  return gulp.src(glob)
    .pipe(stuff());
});

请注意,您的
less
任务和
emberate
当前没有执行此操作看起来
emberate
中有一个错误,它与使用一个进程时的模板有关,而
gulp.watch
正在执行此操作

这是我最后的
gulpfile.js

  var path = require('path');
  var gulp = require('gulp');
  var less = require('gulp-less');
  var refresh = require('gulp-livereload');
  var clean = require('gulp-clean');
  var source = require('vinyl-source-stream');
  var emberate = require('emberate');
  var browserify = require('browserify');

  gulp.task('less', function () {
    return gulp.src('./client/styles/*.less')
      .pipe(less({
        paths: [
          path.join(__dirname, 'client', 'styles')
        ]
      }))
      .pipe(gulp.dest('./dist/styles'))
      .pipe(refresh());
  });

  gulp.task('clean', function () {
    return gulp.src('./client/.index.js', { read: false })
      .pipe(clean());
  });

  gulp.task('emberate', ['clean'], function () {
    return emberate('./client', { pods: true })
      .pipe(source('.index.js'))
      .pipe(gulp.dest('./client'));
  });

  gulp.task('browserify', ['emberate'], function () {
    return browserify('./client/.index.js')
      .bundle()
      //Pass desired output filename to vinyl-source-stream
      .pipe(source('application.js'))
      // Start piping stream to tasks!
      .pipe(gulp.dest('./dist/scripts/'))
      .pipe(refresh());
  });

  gulp.task('watch', function () {
    gulp.watch('./client/styles/*.less', ['less']);
    gulp.watch('./client/**/*.{js,hbs}', ['browserify']);
  });

 gulp.task('default', ['less', 'browserify', 'watch']);

这非常有效:)

实际上
emberate
使用回调方法(
done
),而
less
任务是异步的,不依赖于任何东西,所以我认为这不是罪魁祸首。我也尝试将返回添加到emberate,但结果相同(不删除文件,只是在监视时添加到其中)。没错,
emberate
使用回调<代码>更少
将受益于回报。听起来像是
emberate
browserify
任务的行为都很糟糕:如果这个过程真的要从一个文件中取出文件并放入另一个文件中,那么它们不应该从文件系统中取出文件,而是应该
返回gulp.src('stuff for enbrate').pipe(emberate()).pipe(browserify()).pipe(gulp.dest)('location'))
在一个任务内完成。感谢您的帮助@robrich,我解决了问题,请参阅我的答案。我对文档感到非常困惑-它说“如果fn执行以下操作之一,任务可以异步化…”-它们不是指同步吗?gulp clean
也有一个问题,它没有正确处理异步部分,因此我的同事在这里提交了一份PR: