#gulp
#gulp
Вопрос:
Прямо сейчас я создаю временный файл в Gulp, который предварительно компилирует мои шаблоны. После этого я уродую и объединяю их в один файл javascript. Но я бы предпочел не иметь временных файлов. Есть ли способ иметь «динамические» источники в Gulp? Я попытался объединить потоки, но безрезультатно.
Пример кода:
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'))
});
Комментарии:
1. Не забудьте поставить
return
передgulp.src
, т.е.return gulp.src(...)
чтобы задача возвращала обещание, которое будет выполнено, когда задача будет завершена.
Ответ №1:
Задачи нельзя напрямую передавать в другие задачи, но вы можете использовать event-stream
для объединения потоков:
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'));
});
Комментарии:
1. Этот ответ устарел и неверен, пожалуйста, посмотрите Мой, где я использую
{passthrough: true}
вместе с gulp.src.
Ответ №2:
Таким образом, теоретически вы должны быть в состоянии сделать это с помощью gulp версии 3.8.0 или выше. Вот список изменений с примером функции.
Из журнала изменений:
gulp.src теперь доступен для записи, это означает, что вы можете использовать его для добавления файлов в свой конвейер в любой момент
Итак, ваша задача может быть такой:
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'))
});
К сожалению, похоже, что есть какая-то ошибка, из-за которой возникают проблемы с обработкой определенных глобусов, см. Проблемы, упомянутые здесь и здесь . Надеюсь, они скоро это решат. Это мешает мне использовать это в моем проекте, но в вашем вы добавляете только один файл, так что попробуйте, и, возможно, это сработает.
Если это не сработает, попробуйте использовать merge-stream
https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-multiple-sources-in-one-task.md
Отредактировано, чтобы включить сквозную опцию в gulp.src, упомянутую Бьорном Типлингом
Комментарии:
1. Хорошее решение. 1. Не могли бы вы уточнить этот комментарий: «убедитесь, что вы выполняете concat только после». Вроде как не имеет смысла … Означает ли это «после Ember» или «убедитесь, что вы объединили, прежде чем передавать новый источник»? Извините, если это очевидно, я просто хочу убедиться, что понимаю.
2. @mhulse, я понятия не имею, вам нужно спросить OP. Я сам был в замешательстве по этому поводу. Я только что скопировал из кода OP. Я отредактирую свой ответ, чтобы удалить этот комментарий, потому что он не связан с этим решением.
3. Дох! Мой плохой! Я не видел этого до сих пор. Спасибо за разъяснение и за ответ. 🙂
4. Этот ответ неверен, вам нужно
{ passthrough: true }
в качестве второго аргументаgulp.src
, пожалуйста, смотрите Мой ответ ниже, если вам нужен пример.
Ответ №3:
Для тех, кто все еще сталкивается с этой проблемой, вы можете полностью использовать 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 }))
Эти детали не нужны для вопроса, но на случай путаницы я беру CSS-файлы, созданные с помощью SASS, как часть задачи, а затем объединяю их с файлами SASS, созданными webpack (извлеченными из файлов vue) в отдельной задаче. Мои tasks
и paths
переменные — это то, что я не использую жестко закодированные строки (большую часть времени).
Обратите внимание, я использовал gulp 4.0, но я не думаю, что это имеет значение, passthrough
был добавлен в master в 2015 году
Комментарии:
1. У меня не получилось с gulp 3, который зависит от старой версии vinyl-fs. Я должен был сделать
npm install --save-dev vinyl-fs
и заменитьgulp.src
наrequire('vinyl-fs').src
.