【问题标题】:gulp dependent tasks - browserify and a pre-browserify taskgulp 依赖任务 - browserify 和 pre-browserify 任务
【发布时间】:2014-04-26 19:00:05
【问题描述】:

我有以下gulpfile

我正在使用emberate,它接受一个回调,当生成的文件(在本例中为client/.index.js)被写入时调用。现在browserify 任务依赖于该文件,因此它不应该在 emberate 完成后运行。但我得到不同的结果,有时它有效,有时我得到这个:

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

来自browserify(是的,该文件还不存在)..我不确定我做错了什么,我在我的emberate任务中有done作为回调,而browserify任务取决于emberate。 . 我错过了什么?

编辑:发现了一个小模式,如果我运行它并且没有错误,下次我运行gulp 时会收到错误,但下次我不会,所以每隔一段时间o.O

如果我运行gulp emberate,那效果很好。然后,如果我运行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)

这个最新的version 似乎可以工作,但是在监视文件是否被更改期间,它不会清理client/.index.js 文件,而是不断添加到它o.O(尽管运行gulp emberate 有或没有@ 987654333@ 依赖可以正常工作..)。

【问题讨论】:

    标签: javascript ember.js gulp browserify


    【解决方案1】:

    您需要就每项任务将如何完成提供 gulp 提示。见https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support

    在你所有的任务中切换这个:

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

    到这里:

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

    请注意,您的 less 任务和您的 emberate 目前不执行此操作

    【讨论】:

    • 其实emberate使用的是回调方法(done),而less任务是异步的,不依赖任何东西,所以我不认为它是罪魁祸首。我也尝试将返回添加到 emberate,但结果相同(不删除文件,只是在手表上添加)。
    • 你说得对,emberate 使用回调。 less 将受益于回报。听起来emberatebrowserify 任务都表现得很糟糕:如果该进程真的要将输出文件从一个和另一个中取出,他们不应该将它们从文件系统中拉出,而是你应该@ 987654333@ 在一项任务中。
    • 感谢@robrich 的帮助,我找到了问题,请看我的回答。
    • 我对文档感到非常困惑 - 它说“如果它的 fn 执行以下操作之一,则可以使任务异步......” - 它们不是意味着 同步?
    【解决方案2】:

    看起来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']);
    

    效果很好:)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 2014-08-30
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2016-12-22
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多