Gulp 从另一个任务中吞下源

Gulp 从另一个任务中吞下源,gulp,Gulp,现在我正在Gulp中创建一个临时文件,用于预编译我的模板。在那之后,我丑陋地将它们合并到一个javascript文件中。但我不想有一个临时文件。有没有一种方法可以让“动态”资源被吞食?我试着合并数据流,但没用 示例代码: gulp.task('template', function () { gulp.src('./src/tpl/*.hbs') .pipe(ember()) .pipe(concat('tpl.js')) // make sure to only do co

现在我正在Gulp中创建一个临时文件,用于预编译我的模板。在那之后,我丑陋地将它们合并到一个javascript文件中。但我不想有一个临时文件。有没有一种方法可以让“动态”资源被吞食?我试着合并数据流,但没用

示例代码:

gulp.task('template', function () {
  gulp.src('./src/tpl/*.hbs')
    .pipe(ember())
    .pipe(concat('tpl.js')) // make sure to only do concat after
    .pipe(gulp.dest('tmp'));
});

gulp.task('uglify', ['template'], function() {
  gulp.src(['./tmp/tpl.js', './src/js/app.js'])
    .pipe(uglify())
    .pipe(concat('epg.js'))
    .pipe(gulp.dest('dist'))
});

任务不能直接通过管道传输到其他任务中,但您可以使用
事件流
合并流:

var es = require('event-stream');
function template() {
  return gulp.src('./src/tpl/*.hbs')
    .pipe(ember());
}

function appjs() {
  return gulp.src(['./src/js/app.js']);
}

gulp.task('uglify', function() {
  return es.merge(template(), appjs())
    .pipe(uglify())
    .pipe(concat('epg.js'))
    .pipe(gulp.dest('dist'));
});

因此,理论上,您应该能够使用gulp版本3.8.0或更高版本实现这一点

从变更日志:

gulp.src现在是一个可写的passthrough,这意味着您可以使用它 在任意点向管道添加文件

因此,您的任务可能如下所示:

gulp.task('template', function () {
  return gulp.src('./src/tpl/*.hbs')
    .pipe(ember())
    .pipe(concat('tpl.js'))
    .pipe(gulp.src('./src/js/app.js', { passthrough: true }))
    .pipe(uglify())
    .pipe(concat('epg.js'))
    .pipe(gulp.dest('dist'))
});
不幸的是,似乎有一些bug在处理某些glob时遇到了问题,请参阅上面提到的问题和。希望他们能很快解决这个问题。这使我无法在我的项目中使用它,但在您的项目中,您只添加了一个文件,所以请尝试一下,也许它会起作用

如果不起作用,请尝试使用
合并流


编辑为包含Bjorn Tipling提到的gulp.src的passthrough选项

对于仍然关注此问题的任何人,您完全可以使用gulp.src向任务中流添加其他文件。您只需添加
{passthrough:true}
作为选项。以下是一个工作示例:

gulp.task(tasks.SASS, () => {
  return gulp.src(paths.css.src)
    .pipe(sass().on('error', sass.logError))
    .pipe(gulp.src([ paths.css.vueStyles ], { passthrough: true }))
    .pipe(concat('styles.css'))
    .pipe(gulp.dest(paths.css.dest))
与此问题相关的唯一一条线是:

    .pipe(gulp.src([ paths.css.vueStyles ], { passthrough: true }))
这些细节对于这个问题来说是不必要的,但如果有混淆,我会将通过SASS构建的CSS文件作为任务的一部分,然后将它们与webpack构建的SASS文件(从vue文件中提取)连接在一个单独的任务中。我的
任务
路径
变量不使用硬编码字符串(大多数情况下)


请注意,我使用了gulp 4.0,但我认为这并不重要,

不要忘记在
gulp.src
之前放置一个
return
,即
return gulp.src(…)
,以便任务返回一个在任务完成时得到履行的承诺。很好的解决方案+1.你能澄清一下这句话吗:“确保只在之后做concat”。有点不合情理……这是指“在余烬之后”还是“确保在管道传输新源之前”呢?很抱歉,如果这是显而易见的,我只是想确定我是否理解。@mhulse,我不知道,你得问手术医生。我自己也很困惑。我只是从OP的代码中复制的。我将编辑我的答案以删除该注释,因为它与此解决方案无关。Doh!我的错!直到现在我才看到。感谢您的澄清和回答。:)这个答案是不正确的,你需要
{passthrough:true}
作为
gulp.src
的第二个参数,如果你需要一个例子,请参阅下面的我的答案。这个答案是过时的和不正确的,请参阅我使用的
{passthrough:true}
以及gulp.src。对于我来说,gulp 3不起作用,这取决于旧版本的乙烯基fs。我必须执行
npm安装--保存dev-vinyly-fs
并将
gulp.src
替换为
require('vinyl-fs').src