Использование gulp только для компиляции измененных файлов

У меня много файлов .jade, .styl и .coffee, находящихся в разных подпапках.

Я хотел бы компилировать только измененные файлы, когда они были изменены. Я использую gulp и пришел к следующему шаблону:

var watch = require('gulp-watch'),

watch(['app/**/*.styl'], function (e) {
    gulp.src(e.path)
        .pipe(stylus({use: nib()}))
        .pipe(gulp.dest('./app'))

Однако этот шаблон хранит скомпилированный файл в корне папки ./app, а не в папке, где находится исходный файл. Я много чего перепробовал и все напрасно. Проблема в том, что не хватает документации и примеров для gulp-watch и других.

Может ли кто-нибудь сказать мне, как сохранить скомпилированный файл в папку его источника?


person zhekaus    schedule 15.03.2016    source источник


Ответы (1)


Проблема в том, что вы передаете e.path (т. е. полный путь к каждому измененному файлу) в качестве универсального шаблона для gulp.src(). Это означает, что ваш шаблон glob на самом деле не содержит glob (например, * или **), и в этом случае каталог, в котором находится файл, используется в качестве значения по умолчанию для base option на gulp.src(). Когда файлы затем записываются с помощью gulp.dest(), эта опция base приводит к удалению всей структуры каталогов.

Решение состоит в том, чтобы использовать вариант потоковой передачи gulp-watch вместо варианта обратного вызова. .

gulp.src('app/**/*.styl')
  .pipe(watch('app/**/*.styl'))
  .pipe(stylus({use: nib()}))
  .pipe(gulp.dest('./app'));

... или укажите соответствующую опцию base для варианта обратного вызова:

watch(['app/**/*.styl'], function (e) {
  gulp.src(e.path, {base: 'app'})
    .pipe(stylus({use: nib()}))
    .pipe(gulp.dest('./app'));
});
person Sven Schoenung    schedule 15.03.2016
comment
Ваше решение пересобирает все файлы app/**/*.styl, а мне нужен только один, измененный. - person zhekaus; 15.03.2016
comment
Это происходит только при первом запуске. После этого перезаписываются только те файлы, которые были изменены. Если это не сработает для вас, я отредактировал свой ответ, включив вариант обратного вызова, который не имеет этого недостатка. - person Sven Schoenung; 15.03.2016