【问题标题】:From Grunt to Gulp从 Grunt 到 Gulp
【发布时间】:2014-01-14 15:03:10
【问题描述】:

我目前正在尝试将我的 Grunt 文件转换为 Gulp 文件。我的第一次尝试是使用一个非常简单的文件,它只运行 JSHint 和 Mocha,并具有监视模式。我的第一个结果是相当……嗯……幻灭。

遇到了几个问题,希望有办法解决:

  • 我意识到 Gulp 异步运行所有任务。如果我想等待任务完成,文档会告诉我使用回调、承诺或返回流。但是我如何使用gulp-mochagulp-jshint 做到这一点?这些插件支持吗?
  • 失败的gulp-jshint 并未使构建失败。如果gulp-jshint 失败,我如何告诉 Gulp 停止继续?
  • 使用 Gulp 入门指南中所述的 watch 模式会导致在运行 gulp 时出现 Too many open files 错误。知道可能出了什么问题吗?

(请注意,这里我故意没有说明源代码,因为前两个问题是一般问题,最后一个是默认文件。)

有什么帮助吗?

【问题讨论】:

  • 这不是一个直接的答案。你应该尽量不要对抗 gulp 的异步行为。大多数时候,您可能只想在同一个文件上连续运行一堆任务。在这种情况下,您应该完成一项任务,而不是依赖临时文件。
  • 这个问题不是针对异步执行,而是关于任务依赖的非常合理的需求(参见github.com/gulpjs/gulp/blob/master/docs/…) - 以及如何让 jshint 实际上失败。 OP 甚至没有提到临时文件...
  • Smashing Magazine 最近在using Gulp 上发布了一个方便的指南,您可能会发现和我一样有用。

标签: gruntjs mocha.js jshint gulp


【解决方案1】:

关于任务依赖,最简单的解决方案是从任务中返回 gulp 流,并依赖于该任务。

在下面的代码中,如果“server”任务没有返回流,它将异步运行,导致“serve”任务尝试使用不存在的文件运行服务器。

gulp.task('server', function () {
  return gulp.src('server/**/*.coffee')
      .pipe(coffeescript())
      .pipe(gulp.dest('./dist/'));
});

var expressServer;

gulp.task('serve', ['server'], function () {
  var apiServer = require('./dist/server');
  expressServer = apiServer(function (server) {
    server.use(livereload({
      port: livereloadport
    }));

  });

  expressServer.listen(serverport);

  //Set up your livereload server
  lrserver.listen(livereloadport);
});

【讨论】:

    【解决方案2】:

    对于“停止和失败”部分:

    这是一个使用 jshint 的功能示例:

    var reporter = require('jshint-stylish');
    var jshintRc = readJSON('.jshintrc');
    
    // Implement asynchronous support returning the stream
    gulp.task('myhinter', function() {
      // All js in src
      return gulp.src('./src/*.js')
        // options from file
        .pipe(jshint(jshintRc))
        // like stylish reporter
        .pipe(jshint.reporter(reporter))
        // Our turn!
        .pipe(map(function (file, cb) {
          // Notify the callback "true" if it failed on the file
          cb(!file.jshint.success, file);
        }));
    })
    
    // Now, define thattask to depend on myhinter
    gulp.task('thattask', ['myhinter'], function(e) {
      console.warn('thattask is executing');
    });
    

    thattask 取决于任务myhinter 是否成功。

    myhinter 反过来对文件执行 jshint,reporter 使用时尚,如果至少一个文件提示失败,则失败。

    这里,这是通过从 myhinter 任务返回流来实现的。

    您可以在 Orchestrator 文档中查看更多相关信息:https://github.com/robrich/orchestrator

    我不使用摩卡,但稍后会看看如何做到这一点。

    关于打开的文件太多,是在 OSX 上吗?如果是这样,如果有帮助,请查看this here

    【讨论】:

    • 与第一个问题有关,总结一下:至少到今天为止(有任务依赖),想法是拆分jshintmocha和你的build任务,每个取决于上一个gulp.task('name', ['dependency'], function () {});
    【解决方案3】:

    我解决了“打开的文件太多..”在我的 .bash_profile 中添加以下行:

    ulimit -n 10480
    

    【讨论】:

    • 我不确定增加限制对于某些人来说是一个可以接受的答案,因此存在安全风险。我认为实际上在某些时候 gulp 需要“放开”文件流。一种方法是通过 shell 脚本链接您的一些 gulp 任务。是的,这看起来很奇怪,但是 gulp 的替代方法是什么?她将通过 npm run 或 npm 任务/脚本。
    猜你喜欢
    • 2023-03-25
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多