gulp.run已弃用。我如何撰写任务?

时间:2014-02-20 11:07:37

标签: javascript gulp

这是一个组合任务,我不知道如何用任务依赖项替换它。

...
gulp.task('watch', function () {
 var server = function(){
  gulp.run('jasmine');
  gulp.run('embed');
 };
 var client = function(){
  gulp.run('scripts');
  gulp.run('styles');
  gulp.run('copy');
  gulp.run('lint');
 };
 gulp.watch('app/*.js', server);
 gulp.watch('spec/nodejs/*.js', server);
 gulp.watch('app/backend/*.js', server);
 gulp.watch('src/admin/*.js', client);
 gulp.watch('src/admin/*.css', client);
 gulp.watch('src/geojson-index.json', function(){
  gulp.run('copygeojson');
 });
});

相应的更改日志 https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#35 [弃用gulp.run]

10 个答案:

答案 0 :(得分:86)

或者你可以这样做:

gulp.start('task1', 'task2');

答案 1 :(得分:80)

gulp.task('watch', function () {
  var server = ['jasmine', 'embed'];
  var client = ['scripts', 'styles', 'copy', 'lint'];
  gulp.watch('app/*.js', server);
  gulp.watch('spec/nodejs/*.js', server);
  gulp.watch('app/backend/*.js', server);
  gulp.watch('src/admin/*.js', client);
  gulp.watch('src/admin/*.css', client);
  gulp.watch('src/geojson-index.json', ['copygeojson']);
});

您不再需要传递函数(尽管您仍然可以)来运行任务。您可以为监视提供一系列任务名称,它将为您完成此任务。

答案 2 :(得分:25)

来源:https://github.com/gulpjs/gulp/issues/755

gulp.start()从未打算成为公共API,也不会被使用。正如上面评论中所述,任务管理正在下一个版本中被替换....所以gulp.start()将会破坏。

gulp设计的真正目的是制作常规的Javascript函数,并且只进行调用它们的任务。

示例:

function getJsFiles() {
    var sourcePaths = [
        './app/scripts/**/*.js',
        '!./app/scripts/**/*.spec.js',
        '!./app/scripts/app.js'
    ];

    var sources = gulp.src(sourcePaths, { read: false }).pipe(angularFilesort());

    return gulp.src('./app/index.html')
        .pipe(injector(sources, { ignorePath: 'app', addRootSlash: false }))
        .pipe(gulp.dest('./app'));
}  

gulp.task('js', function () {
    jsStream = getJsFiles();
});

答案 3 :(得分:12)

请原谅我复活旧问题。接受的答案没有解决在设置手表之前运行任务的问题。下一个答案使用gulp.start即将消失。第三个答案指出应该使用常规函数,但示例似乎很奇怪。我做了一些搜索,但没有找到一个简单的例子。

这是我的解决方案。我们的想法是定义常规的js函数,然后将它们注册为任务。然后,如果需要或可以在手表内直接调用这些功能。

var 
  gulp     = require('gulp'),
  concat   = require('gulp-concat'),
  markdown = require('gulp-showdown')
;
var scriptFiles   = [ 'ang/app.js' ];
var markdownFiles = [ 'content/articles/*.md'];

var watchTask = function() 
{
  buildTask();

  gulp.watch(scriptFiles,  ['scripts' ]);
  gulp.watch(markdownFiles,['markdown']);
};
gulp.task('watch',watchTask);

var buildTask = function()
{
  scriptsTask();
  markdownTask();
};
gulp.task('build',buildTask);

var markdownTask = function() 
{
  gulp.src(markdownFiles)
    .pipe(markdown())
    .pipe(gulp.dest('web/articles'));
};
gulp.task('markdown',markdownTask);

var scriptsTask = function() 
{
  gulp.src(scriptFiles)
    .pipe(concat('app.js'))
    .pipe(gulp.dest('web/js'));

  gulp.src(
    [
      'bower_components/angular/angular.min.js',
      'bower_components/angular-route/angular-route.min.js'
    ])
    .pipe(concat('vendor.js'))
    .pipe(gulp.dest('web/js'));

  gulp.src(
    [
      'bower_components/angular/angular.min.js.map',
      'bower_components/angular-route/angular-route.min.js.map'
    ])
    .pipe(gulp.dest('web/js'));
};
gulp.task('scripts', scriptsTask);

我是gulp的新手。如果我忽略了一些显而易见的事情,请告诉我。

答案 4 :(得分:5)

正如@dman提到的那样,gulp.start将在下一个版本中被丢弃。它也可以在this issue of gulp中看到。

在@Pavel Evstigneev答案的评论中,@ joemaller提到我们可以在这种情况下使用run-sequence

但请注意,run-sequence的作者说:

  

这是一个临时的解决方案,直到gulp 4.0发布,它支持串行或并行定义任务依赖。

     

请注意,此解决方案是一种黑客攻击,可能会停止使用未来的更新来进行吞咽。

所以,在gulp 4.0之前,我们可以使用 run-sequence ,在4.0之后,我们可以使用gulp。

答案 5 :(得分:5)

gulp 4

gulp.parallel('taskName1', 'taskName2')()
gulp.series('taskName1', 'taskName2')()

我喜欢gulp4!

答案 6 :(得分:3)

如果您需要维护正在运行的任务的顺序,您可以按照here所述定义依赖关系 - 您只需要从依赖项返回流:

gulp.task('dependency', function () {
  return gulp.src('glob')
    .pipe(plumber())
    .pipe(otherPlugin())
    .pipe(gulp.dest('destination'));
});

定义依赖于它的任务:

gulp.task('depends', [ 'dependency' ], function () {
  // do work
});

从观看中使用它:

gulp.task('watch', function () {
  watch('glob', [ 'depends' ]);
});

现在dependecy任务将在depends运行之前完成(例如,'jasmine'和'embed'任务将是依赖项,你将拥有另一个依赖于它们的任务'服务器' )。不需要任何黑客攻击。

答案 7 :(得分:1)

要在开始观看之前运行任务,而不是使用gulp.run()或gulp.start(),只需直接运行gulp命令。

所以而不是:

var compress = function () {
    return gulp.src('js/vendor/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./build/js/'));
};

只是做:

gulp.src('js/vendor/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./build/js/'));

或者你可以将后一个代码包装在" normal"功能,并随时调用它。

- 灵感来自this answer from a similar thread

答案 8 :(得分:1)

在Gulp 4中,似乎唯一对我有用的是:

gulp.task('watch', function() {
    gulp.watch(['my-files/**/*'], gulp.series('my-func'));
});

gulp.task('my-func', function() {
    return gulp.src('[...]').pipe(gulp.dest('...'));
});

答案 9 :(得分:0)

我仍然没有看到这实际上是如何解决手头的问题。

如果我有4个任务,它们之间定义了依赖关系

A,B,C,d

其中A依赖于gulp.task('A',['B'],function A(){});定义的B等,然后我使用gulp.watch定义了一个新任务,只运行这些函数会复制依赖项。

例如,给定这些任务(每个任务函数通过名称公开):

function A(){}
gulp.task('A',['B'],A);

function A(){}
gulp.task('A',['B'],A);

function B(){}
gulp.task('B',['C'],B);

function C(){}
gulp.task('C',['D'],C);

function D(){}
gulp.task('D',[],D);

我可以写1)

gulp.task('WATCHER', ['A'], function(){
   ...
}

会执行A-> D但是如果例如步骤B失败则它将永远不会进入任务(想到编译或测试错误)

或者我可以写2)

gulp.task('WATCHER', [], function(){
   gulp.watch(...,['A'])
}

在首先更改某些内容之前不会运行A-> D.

或者我可以写3)

gulp.task('WATCHER', [], function(){
   D();
   C();
   B();
   A();
   gulp.watch(...,['A'])
}

会导致依赖关系层次结构的重复(以及随时间的错误)。

PS:如果有人想知道为什么我希望我的监视任务执行,如果任何依赖任务失败,通常是因为我使用watch进行实时开发。例如。我开始我的手表任务开始进行测试等等。可能是我开始的初始代码已经出现问题,因此错误。

所以我希望gulp运行或等效停留一段时间