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


97

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

...
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]

Answers:


82
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']);
});

您不再需要传递函数(尽管您仍然可以)来运行任务。您可以给watch一个任务名称数组,它将为您完成任务。


13
如果我想在开始观看之前执行一些任务怎么办?例如,我想观看scripts,但是强制立即运行此任务(无需等到某些脚本文件更改)也很有意义。
Monsignor

4
有什么方法可以将参数传递给这些任务吗?
Ernie博士2014年

7
@rachel与Monsingor提出的问题无关。
Mark Amery 2015年

6
@Monsingor为此,您可以定义一个新任务来执行任务列表。例如,我通常定义以下默认任务gulp.task('default', ['build', 'watch']);,该任务首先构建,然后开始监视。
巴斯蒂安·范登伯格2015年

1
@BastiaanvandenBerg我以为gulp任务旨在并行运行?因此,即使您首先列出构建,也不必在监视任务触发之前完成。我从OP那里得到了他们想要确保在观看开始之前完成构建的信息。
肖恩·瑞安

85

或者您可以这样做:

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

3
使用安全吗?我没有在API文档(链接)中看到它。
Felix Rabe 2014年

4
.start是Orchestrator方法。由于Gulp继承自此,因此它应该起作用。我正在从非Gulp函数(watchify)触发一个Gulp任务,这似乎正在工作。
joemaller 2014年

24
gulp.start将在下一个版本中删除:github.com/gulpjs/gulp/issues/505#issuecomment-45379280
yckart 2014年

13
@yckart那么我们要用什么来执行任务呢?
chovy

6
对此进行修改,gulp-start可以将大多数使用替换为run-sequence npmjs.com/package/run-sequence
joemaller 2015年

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();
});

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);

我是新来的。如果我忽略了明显的内容,请告诉我。


这也使创建“ build”任务和“ rebuild”任务更加容易,这两个任务都调用完成工作的函数,但后者也依赖于“ clean”任务。
赛斯2015年

1
这是否也与普通的gulp任务有同样的问题,因为JS将继续gulp.watch执行在确认完成watchTask()之前定义的任务buildTask()?我觉得这仍然是一个竞赛条件,并且不能保证在观看之前进行构建。
肖恩·瑞安

7

口香糖4

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

我喜欢gulp4!


经过大量搜索后的最佳答案。谢谢。
AminFarajzadeh,

5

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

在@Pavel Evstigneev的答案的评论中,@ joemaller提到我们可以在这种情况下使用运行顺序

但是请注意,运行序列的作者说:

打算在gulp 4.0发行之前,这是一个临时解决方案,该版本支持串行或并行定义任务依赖项。

请注意,此解决方案是一种破解,并且可能会在以后的gulp更新中停止工作。

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


3

如果需要保持运行任务的顺序,则可以按此处所述定义依赖关系-您只需要从依赖关系返回流:

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运行之前完成(例如,您的“茉莉花”和“嵌入”任务将是依赖项,您将有另一个依赖于它们的任务“服务器”)。无需任何黑客。


我不确定它是否不是题外话,因为它只能回答应该是单独问题的评论中的问题
Killah 2015年

2

在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('...'));
});

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/'));

或者,您可以将后面的代码包装在“普通”函数中,并在需要时调用它。

-受到类似线索的启发。


0

我仍然看不到这实际上如何解决眼前的问题。

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

A B C D

其中A依赖于B,由B定义,gulp.task('A',['B'],function A(){});依此类推,然后我使用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:如果有人想知道为什么如果任何依赖任务失败,我为什么希望我的监视任务执行,通常是因为我使用监视进行实时开发。例如。我开始监视任务以开始进行测试等工作,可能是我开始使用的初始代码已经存在问题,因此会出错。

所以我希望大口小口跑或一些等效停留一段时间


这种反驳针对的是哪个现有答案?
Mogsdad '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.