如何在每次Gulpfile更改后重新启动Gulp?

coo*_*ool 65 javascript workflow node.js gulp gulp-watch

我正在开发一个Gulpfile.一旦它改变就可以重新启动吗?我正在用CoffeeScript开发它.可以Gulp观看Gulpfile.coffee以便在保存更改时重新启动?

Cai*_*nha 59

您可以创建一个task这种意愿gulp.watchgulpfile.js,只是spawn另一个一饮而尽child_process.

var gulp = require('gulp'),
    argv = require('yargs').argv, // for args parsing
    spawn = require('child_process').spawn;

gulp.task('log', function() {
  console.log('CSSs has been changed');
});

gulp.task('watching-task', function() {
  gulp.watch('*.css', ['log']);
});

gulp.task('auto-reload', function() {
  var p;

  gulp.watch('gulpfile.js', spawnChildren);
  spawnChildren();

  function spawnChildren(e) {
    // kill previous spawned process
    if(p) { p.kill(); }

    // `spawn` a child `gulp` process linked to the parent `stdio`
    p = spawn('gulp', [argv.task], {stdio: 'inherit'});
  }
});
Run Code Online (Sandbox Code Playgroud)

我用yargs它来接受我们需要重启后运行的"主要任务".所以为了运行它,你会打电话给:

gulp auto-reload --task watching-task
Run Code Online (Sandbox Code Playgroud)

要测试,请调用touch gulpfile.jstouch a.css查看日志.

  • 这似乎是_complicated_,我希望它和[Grunt]一样简单(http://stackoverflow.com/a/20906149/288906) (16认同)
  • 这是一个很好的伎俩.我想做的一件事就是将任务命名为"auto-reload",然后像`gulp auto-reload --task foo`那样运行它,否则你可以得到一个启动默认任务的分叉炸弹递归. (4认同)

小智 39

我创建条美洲是gulp.js CLI包装以重新启动gulpfile变化一饮而尽.

你可以简单地用gulper替换gulp.

$ gulper <task-name>
Run Code Online (Sandbox Code Playgroud)

  • 非常简单优雅的解决方案. (2认同)

Sim*_*amp 11

我为此目的使用了一个小的shell脚本.这也适用于Windows.

Ctrl+C停止脚本.

// gulpfile.js
gulp.task('watch', function() {
    gulp.watch('gulpfile.js', process.exit);
});
Run Code Online (Sandbox Code Playgroud)

Bash shell脚本:

# watch.sh
while true; do
    gulp watch;
done;
Run Code Online (Sandbox Code Playgroud)

Windows版本: watch.bat

@echo off
:label
cmd /c gulp watch
goto label
Run Code Online (Sandbox Code Playgroud)


joe*_*ler 9

EADDRINUSE在Caio Cunha的答案中遇到了一堆错误.我的gulpfile打开一个带有connectLiveReload的本地网络服务器.看起来新的gulp进程在旧进程被杀死之前与旧的进程短暂共存,因此端口仍然在即将到来的进程中使用.

这是一个解决共存问题的类似解决方案(主要基于):

var gulp = require('gulp');
var spawn = require('child_process').spawn;

gulp.task('gulp-reload', function() {
  spawn('gulp', ['watch'], {stdio: 'inherit'});
  process.exit();
});

gulp.task('watch', function() {
  gulp.watch('gulpfile.js', ['gulp-reload']);
});
Run Code Online (Sandbox Code Playgroud)

这样做效果很好,但有一个相当严重的副作用:最后一个吞咽过程与终端断开连接.因此,当gulp watch退出时,孤立的gulp进程仍在运行.我无法解决这个问题,可以手动杀死额外的gulp进程,或者只是将语法错误保存到gulpfile.js.