如何通过管道传输到 Gulp 中的另一个任务?

Posted

技术标签:

【中文标题】如何通过管道传输到 Gulp 中的另一个任务?【英文标题】:How to pipe to another task in Gulp? 【发布时间】:2014-06-20 22:13:11 【问题描述】:

我尝试干燥我的 gulpfile。在那里,我有一些我不满意的代码重复。怎样才能做得更好?

gulp.task('scripts', function() 
  return gulp.src('src/scripts/**/*.coffee')
    .pipe(coffeelint())
    .pipe(coffeelint.reporter())
    .pipe(coffee())
    .pipe(gulp.dest('dist/scripts/'))
    .pipe(gulp.src('src/index.html'))  // this
    .pipe(includeSource())             // needs
    .pipe(gulp.dest('dist/'))          // DRY
);

gulp.task('index', function() 
  return gulp.src('src/index.html')
    .pipe(includeSource())
    .pipe(gulp.dest('dist/'))
);

我把index 作为一个单独的任务,因为我需要观看src/index.html 才能重新加载。但我也在关注我的.coffee 来源,当它们发生变化时,我也需要更新src/index.html

如何在scripts 中通过管道连接到index

【问题讨论】:

How to run Gulp tasks synchronously/one after the other的可能重复 【参考方案1】:

gulp 使您能够根据参数对一系列任务进行排序。

例子:

gulp.task('second', ['first'], function() 
   // this occurs after 'first' finishes
);

试试下面的代码,你将运行任务'index'来运行这两个任务:

gulp.task('scripts', function() 
  return gulp.src('src/scripts/**/*.coffee')
    .pipe(coffeelint())
    .pipe(coffeelint.reporter())
    .pipe(coffee())
    .pipe(gulp.dest('dist/scripts/'));
);

gulp.task('index', ['scripts'], function() 
  return gulp.src('src/index.html')
    .pipe(includeSource())
    .pipe(gulp.dest('dist/'))
);

任务index 现在需要在运行其函数内的代码之前完成scripts

【讨论】:

我会尽快尝试这种方法。 如果scripts 会运行,并且需要在scripts 之后运行index 会怎样? 我更喜欢使用run-sequence 来编排我的任务,所以总的来说这个解决方案是正确的 - 将重复作业分离到自己的 gulp.task 中。 @vsync 那么您将创建一个调用 index 的任务,其调用方式与 index 调用脚本的方式相同。它将很好地链接在一起,因此您只能从控制台调用一项任务。在这种情况下'gulp index' 将流保存到磁盘以在另一个任务中加载它?这种模式看起来比“gulpy”更“笨拙”。【参考方案2】:

如果您查看 Orchestrator 源代码,尤其是 .start() 实现,您会发现如果最后一个参数是一个函数,它会将其视为回调。

我为自己的任务编写了这个 sn-p:

  gulp.task( 'task1', () => console.log(a) )
  gulp.task( 'task2', () => console.log(a) )
  gulp.task( 'task3', () => console.log(a) )
  gulp.task( 'task4', () => console.log(a) )
  gulp.task( 'task5', () => console.log(a) )

  function runSequential( tasks ) 
    if( !tasks || tasks.length <= 0 ) return;

    const task = tasks[0];
    gulp.start( task, () => 
        console.log( `$task finished` );
        runSequential( tasks.slice(1) );
     );
  
  gulp.task( "run-all", () => runSequential([ "task1", "task2", "task3", "task4", "task5" ));

【讨论】:

以上是关于如何通过管道传输到 Gulp 中的另一个任务?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过管道传输到文件(NodeJS)

如何将 find 命令返回的文件列表通过管道传输到 cat 以查看所有文件

如何使用 Perl 将输入通过管道传输到 Java 应用程序?

如何将 Kafka 消息通过管道传输到 docker 容器中?

如何在 gulp 中创建重复管道?

Linux:如何正确地将文本通过管道传输到程序中?