从Grunt到Gulp

13
我目前正在尝试将我的Grunt文件转换为Gulp文件。 我的第一次尝试是使用一个非常简单的文件,该文件仅运行JSHint和Mocha,并具有监视模式。 我的第一次结果相当...哎...让人失望。
我遇到了几个问题,希望有办法解决它们:
- 我意识到Gulp异步运行所有任务。 如果我想等待任务完成,文档告诉我使用回调、Promise或返回流。 但是如何在gulp-mocha和gulp-jshint中执行此操作? 这些插件支持吗? - 失败的gulp-jshint没有使构建失败。 如何告诉Gulp如果gulp-jshint失败就停止继续执行? - 使用Gulp入门指南中描述的watch模式会导致运行gulp时出现“打开的文件太多”错误。 有任何想法错在哪里?
(请注意,我故意没有在此处指定源代码,因为前两个问题是一般问题,最后一个问题涉及默认文件。)
这方面有什么帮助吗?

1
这不是直接答案。尽可能不要与gulp的异步行为抗衡。大多数情况下,您可能只想按顺序运行一堆任务在同一个文件上。在这种情况下,您应该创建一个任务而不是依赖于临时文件。 - Naman Goel
3
问题并非旨在抵制异步执行,而是关于任务依赖的合理需求(请参见 https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulptaskname-deps-fn)-以及如何使 jshint 实际上失败。原帖作者甚至没有提到临时文件... - Mangled Deutz
2
Smashing Magazine 最近发布了一份方便的指南,介绍如何使用 Gulp,你可能会像我一样觉得它很有用。 - idleberg
3个回答

10

关于任务依赖,最简单的解决方案是从任务中返回 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);
});

4

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

下面是一个使用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 检查,使用 stylish 报告错误,并在至少有一个文件未通过检查时失败。

为此,可以从 myhinter 任务返回流来实现。

关于更多内容,请参阅 orchestrator 文档:https://github.com/robrich/orchestrator

我不使用 mocha,但稍后会看一下如何做。

关于打开的文件太多,是在 OSX 上吗?如果是,可以尝试查看这里是否有帮助。


关于第一个问题的总结:至少截至今日(存在任务依赖),想法是将jshintmocha和您的build任务分开,每个任务都依赖于前一个任务,使用gulp.task('name', ['dependency'], function () {}); - smhg

0

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

ulimit -n 10480

1
我不确定增加限制对于某些人来说是否是一个可接受的答案,因为这可能会带来安全风险。我认为实际上,在某个时候,gulp 需要“放手”文件流。一种方法是通过 shell 脚本链接一些 gulp 任务。是的,这似乎很奇怪,但在 gulp 中有什么替代方案呢?使用 Shell 或者通过 npm 运行 npm 任务/脚本。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接