Stream 吞咽:在另一个任务中使用一个任务的输出

Stream 吞咽:在另一个任务中使用一个任务的输出,stream,gulp,Stream,Gulp,我有三个gulp任务,其中最后一个任务(allScripts)首先运行两个相关任务,然后从它们连接生成的文件 在最后一个任务中,我可以删除前两个任务中的两个结果文件,并从此快乐地生活在连接的文件中 但是我在想,是否可以通过某种方式将这两个临时文件“直接”管道化到allScripts任务中来避免它们 如果所有内容都可以是单个任务,那么可以使用该插件将多个流合并为一个。如果任务需要保持分离,下面还有一个解决方案,但请注意,该方法是一种黑客攻击,因为它依赖于Gulp中的暴露属性 如果没有黑客解决方案,

我有三个gulp任务,其中最后一个任务(
allScripts
)首先运行两个相关任务,然后从它们连接生成的文件

在最后一个任务中,我可以删除前两个任务中的两个结果文件,并从此快乐地生活在连接的文件中

但是我在想,是否可以通过某种方式将这两个临时文件“直接”管道化到
allScripts
任务中来避免它们


如果所有内容都可以是单个任务,那么可以使用该插件将多个流合并为一个。如果任务需要保持分离,下面还有一个解决方案,但请注意,该方法是一种黑客攻击,因为它依赖于Gulp中的暴露属性

如果没有黑客解决方案,在另一个任务中使用一个任务的输出将需要中间存储,就像处理文件一样

单一任务解决方案: 下面是一个裸体演示,使用:

var gulp=require('gulp');
var gulpMerge=require('gulp-merge');
var concat=需要(“咕噜咕噜咕噜”);
var replace=需要('gulp-replace');
gulp.task('all-txt',function(){
返回gulpMerge(
gulp.src('file1.txt')
.管道(更换(/foo/g,'bar')),
gulp.src('file2.txt')
.管道(替换(/baz/g,'qux'))
)
.pipe(concat('all-text.txt'))
.管道(大口目的地(“目的地”);
});

在您的情况下,使用您问题中的代码,它看起来像:

var gulp=require('gulp');
var gulpMerge=require('gulp-merge');
var concat=需要(“咕噜咕噜咕噜”);
// ... 你的插件
gulp.task('allScripts',function()){
返回gulpMerge(
gulp.src('some/files/*.js')
.pipe(doSomething())
.pipe(concat('some-scripts.js')),
gulp.src('some/other/files/*.js')
.pipe(doSomethingElse())
.pipe(concat('some-other-scripts.js'))
)
.pipe(concat('all-scripts.js'))
.管道(大口目的地(“目的地”);
});

多任务解决方案: 如果您的任务结构无法使用上述方法将它们合并到单个任务中,这是您的最佳选择。它依赖于
Gulp.tasks
,这是一种非标准的公开属性,从这个意义上讲,它有点不成熟。没有保证这将适用于Gulp的未来版本(目前使用Gulp v3.8.10进行测试)

这个代码段依赖于包,因为它更健壮,我在
runTasksAndGetStreams
函数中使用了它们的一些实用程序

var gulp=require('gulp');
var concat=需要(“咕噜咕噜咕噜”);
var replace=需要('gulp-replace');
var es=需要(‘事件流’);
gulp.task('all-txt',function(){
返回es.merge.apply(null,runTasksAndGetStreams(['file1-txt','file2-txt']))
.pipe(concat('all-text.txt'))
.管道(大口目的地(“目的地”);
});
gulp.task('file1-txt',['random-task-dep',function()){
返回gulp.src('file1.txt')
.管道(更换(/foo/g,'bar');
});
gulp.task('file2-txt',function(){
返回gulp.src('file2.txt')
.管道(替换(/baz/g,'qux'));
});
吞咽任务('random-task-dep',function(){
返回gulp.src('random-file.txt')
.管道(大口目的地(“目的地”);
});
//运行给定的任务并返回它们的流
//这还将处理任何任务依赖关系
//
//这基本上是一个定制的吞咽任务管弦乐队。
//
//就这一问题编写:http://stackoverflow.com/q/28334314/796832
//要点:https://gist.github.com/MadLittleMods/d4083d2ba35e2f850161
//
//参数:
//任务名称:任务名称的字符串或字符串数组
//debugLog:*可选*布尔值,用于将一些调试信息打印到控制台
函数gulpRunTasksAndGetStreams(任务名,/*可选*/debugLog){
//您可以传入要完成的单个任务或任务数组
taskNames=[].concat(taskNames);
//我们将使用“gulp util”的各个部分进行聚合,以防有人想在不安装“gulp util”的情况下使用它`
var gutil;
试一试{
gutil=require('gulp-util');
}
捕捉(错误){
gutil={
日志:console.log,
颜色:{
青色:功能(str){
返回str;
},
品红:功能(str){
返回str;
}
}
};
}
var resultantaskinfo=[];
var taskMap=gulp.tasks;
//满足所有任务依赖项,创建占位符流,并收集func
//要使真正的流在以后完成依赖关系时传入,请使用“mergedDepStream.on('end'))`
var mergedDepStream=null;
taskNames.forEach(函数(taskName){
var task=taskMap[taskName];
如果(调试日志){
log('root任务:',gutil.colors.cyan(任务名),'startedworking');
}
//首先运行任何依赖项
var deptstreamresult=runDependenciesRecursivelyForTask(任务名,任务映射);
如果(结果){
mergedDepStream=mergedDepStream?es.merge(mergedDepStream,depStreamResult):depStreamResult;
}
如果(调试日志){
如果(结果){
depStreamResult.on('end',function()){
log('root任务:',gutil.colors.cyan(任务名),'deps done');
});
}
否则{
log('root任务:',gutil.colors.cyan(任务名称),'no dep present');
}
}
//然后将任务本身推到列表上
resultantaskinfo.push({
流:es.through(),
fn:task.fn
});
});
//一旦所有依赖项都完成了
mergedDepStream.on('end',function()){
如果(调试日志){
log('完成所有依赖项,在实际根任务中执行管道');
}
//将实际任务导入占位符
结果
gulp.task('firstGroup', function() {
  return gulp.src('some/files/*.js')
    .pipe(doSomething())
    .pipe(concat('some-scripts.js'))
    .pipe(gulp.dest('dest'));
});

gulp.task('secondGroup', function() {
  return gulp.src('some/other/files/*.js')
    .pipe(doSomethingElse())
    .pipe(concat('some-other-scripts.js'))
    .pipe(gulp.dest('dest'));
});

gulp.task('allScripts', ['firstGroup','secondGroup'], function() {
  return gulp.src(['dest/some-scripts.js','dest/some-other-scripts.js'])
    .pipe(concat('all-scripts.js'))
    .pipe(gulp.dest('dest'))
    // delete the two src-files
});