Gulp 从另一个任务中吞下源
现在我正在Gulp中创建一个临时文件,用于预编译我的模板。在那之后,我丑陋地将它们合并到一个javascript文件中。但我不想有一个临时文件。有没有一种方法可以让“动态”资源被吞食?我试着合并数据流,但没用 示例代码: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.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
。