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

tou*_*tpt 96 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');
 });
});
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*eev 85

或者你可以这样做:

gulp.start('task1', 'task2');
Run Code Online (Sandbox Code Playgroud)

  • `gulp.start`将在下一个版本中删除:https://github.com/gulpjs/gulp/issues/505#issuecomment-45379280 (23认同)
  • @yckart那么我们用什么来执行任务呢? (13认同)
  • 为了解决这个问题,`gulp-start`的大多数用法可以用`run-sequence`替换https://www.npmjs.com/package/run-sequence (6认同)
  • `.start`是一个Orchestrator方法.由于Gulp继承了它,它应该工作.我正在从非gulp函数(watchify)触发gulp任务,这似乎正在起作用. (4认同)
  • 这样安全吗?我没有在[API文档(链接)](https://github.com/gulpjs/gulp/blob/master/docs/API.md)中看到它. (3认同)
  • 不,这不安全!由于某种原因,它不在api中,它只在Gulp名称空间中作为继承的副作用提供.你只需要正常的JS函数.然后从包含在任务中的函数调用它们.这非常简单.https://github.com/gulpjs/gulp/issues/458#issuecomment-62057370 (2认同)
  • 我希望他们把它留在里面.使用它并不觉得黑客是简单而优雅的. (2认同)

Con*_*tra 81

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']);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我想在开始观看之前执行某项任务怎么办?例如,我想观看`scripts`,但强制立即执行此任务也是有意义的(无需等到某些脚本文件发生更改). (13认同)
  • @rachel与Monsingor问的问题无关. (7认同)
  • @Monsingor要实现这一点,您可以定义执行任务列表的新任务.例如,我通常定义以下默认任务`gulp.task('default',['build','watch']);`,它首先构建然后开始观看. (6认同)
  • 有没有办法将参数传递给那些任务? (4认同)

dma*_*man 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'));
}  
Run Code Online (Sandbox Code Playgroud)
gulp.task('js', function () {
    jsStream = getJsFiles();
});
Run Code Online (Sandbox Code Playgroud)


Cer*_*rad 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);
Run Code Online (Sandbox Code Playgroud)

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


Qia*_*yue 5

正如@dman提到的那样,gulp.start将在下一个版本中被丢弃.也可以在这个gulp问题中看到.

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

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

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

请注意,此解决方案是一个黑客攻击,并可能会停止使用未来的更新gulp.

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


小智 5

口香糖4

gulp.parallel('taskName1', 'taskName2')()
gulp.series('taskName1', 'taskName2')()
Run Code Online (Sandbox Code Playgroud)

我喜欢gulp4!