Как сохранить поток в нескольких местах назначения с глотком.Джей?
var gulp = require('gulp');
var $ = require('gulp-load-plugins')();
var source = require('vinyl-source-stream');
var browserify = require('browserify');
gulp.task('scripts', function () {
return browserify('./src/app.js').bundle()
.pipe(source('app.js'))
.pipe(gulp.dest('./build')) // OK. app.js is saved.
.pipe($.rename('app.min.js'))
.pipe($.streamify($.uglify())
.pipe(gulp.dest('./build')); // Fail. app.min.js is not saved.
});
конвейер для нескольких мест назначения, когда файл.содержимое потока в настоящее время не поддерживается. Что такое решение этой проблемы?
5 ответов:
В настоящее время вы должны использовать два потока для каждого dest при использовании файла.содержание как поток. Возможно, это будет исправлено в будущем.
var gulp = require('gulp'); var rename = require('gulp-rename'); var streamify = require('gulp-streamify'); var uglify = require('gulp-uglify'); var source = require('vinyl-source-stream'); var browserify = require('browserify'); var es = require('event-stream'); gulp.task('scripts', function () { var normal = browserify('./src/index.js').bundle() .pipe(source('bundle.js')) .pipe(gulp.dest('./dist')); var min = browserify('./src/index.js').bundle() .pipe(rename('bundle.min.js')) .pipe(streamify(uglify()) .pipe(gulp.dest('./dist')); return es.concat(normal, min); });
EDIT: эта ошибка теперь исправлена в gulp. Код в исходном сообщении должен работать нормально.
я столкнулся с подобной проблемой и хотел, чтобы источник gulp был скопирован в несколько мест после задач lint, uglify и minify. Я в конечном итоге решить эту проблему, как показано ниже,
gulp.task('script', function() { return gulp.src(jsFilesSrc) // lint command // uglify and minify commands .pipe(concat('all.min.js')) .pipe(gulp.dest('build/js')) // <- Destination to one location .pipe(gulp.dest('../../target/build/js')) // <- Destination to another location });
Я думаю, что этот путь легче. Justo у вас есть два назначения, но перед Minify plugin вы ставите один путь к обычному файлу, и вы ставите плагин minify по пути, который вы хотите иметь файл minify.
например:
gulp.task('styles', function() { return gulp.src('scss/main.scss') .pipe(sass()) .pipe(gulp.dest('css')) // Dev normal CSS .pipe(minifycss()) .pipe(gulp.dest('public_html/css')); // Live Minify CSS });
в случае широковещательных обновлений для нескольких пунктов назначения, зацикливание
gulp.dest
команда над массивом назначений работает хорошо.var gulp = require('gulp'); var source = './**/*'; var destinations = [ '../foo/dest1', '../bar/dest2' ]; gulp.task('watch', function() { gulp.watch(source, ['sync']); }); gulp.task('sync', function (cb) { var pipeLine = gulp.src(source); destinations.forEach(function (d) { pipeLine = pipeLine.pipe(gulp.dest(d)); }); return pipeLine; });
У меня было много той же проблемы с Gulp, для различных задач конвейерная передача по нескольким направлениям кажется сложной или потенциально невозможной. Кроме того, настройка нескольких потоков для одной задачи кажется неэффективной, но я думаю, что это решение на данный момент.
для моего текущего проекта мне нужно было несколько пакетов, связанных с различными страницами. Изменение стартера глотка
https://github.com/greypants/gulp-starter
browserify / watchify задача:
https://github.com/dtothefp/gulp-assemble-browserify/blob/master/gulp/tasks/browserify.js
я использовал цикл forEach внутри обратного вызова модуля glob:
gulp.task('browserify', function() { var bundleMethod = global.isWatching ? watchify : browserify; var bundle = function(filePath, index) { var splitPath = filePath.split('/'); var bundler = bundleMethod({ // Specify the entry point of your app entries: [filePath], // Add file extentions to make optional in your requires extensions: ['.coffee', '.hbs', '.html'], // Enable source maps! debug: true }); if( index === 0 ) { // Log when bundling starts bundleLogger.start(); } bundler .transform(partialify) //.transform(stringify(['.html'])) .bundle() // Report compile errors .on('error', handleErrors) // Use vinyl-source-stream to make the // stream gulp compatible. Specifiy the // desired output filename here. .pipe(source( splitPath[splitPath.length - 1] )) // Specify the output destination .pipe(gulp.dest('./build/js/pages')); if( index === (files.length - 1) ) { // Log when bundling completes! bundler.on('end', bundleLogger.end); } if(global.isWatching) { // Rebundle with watchify on changes. bundler.on('update', function(changedFiles) { // Passes an array of changed file paths changedFiles.forEach(function(filePath, index) { bundle(filePath, index); }); }); } } // Use globbing to create multiple bundles var files = glob('src/js/pages/*.js', function(err, files) { files.forEach(function(file, index) { bundle(process.cwd() + '/' + file, index); }) }); });