Gulps gulp.watch не запускается для новых или удаленных файлов?
Следующая задача Gulpjs отлично работает при редактировании файлов в матче:
// watch task.
gulp.task('watch', ['build'], function () {
gulp.watch(src + '/js/**/*.js', ['scripts']);
gulp.watch(src + '/img//**/*.{jpg,jpeg,png,gif}', ['copy:images']);
gulp.watch(src + '/less/*.less', ['styles']);
gulp.watch(src + '/templates/**/*.{swig,json}', ['html']);
});
// build task.
gulp.task('build', ['clean'], function() {
return gulp.start('copy', 'scripts', 'less', 'htmlmin');
});
Однако он не работает (не запускается) для новых или удаленных файлов. Что-то мне не хватает?
РЕДАКТИРОВАТЬ: даже с помощью плагина grunt-watch кажется, что он не работает:
gulp.task('scripts', function() {
return streamqueue(
{ objectMode: true },
gulp.src([
vendor + '/jquery/dist/jquery.min.js',
vendor + '/bootstrap/dist/js/bootstrap.min.js'
]),
gulp.src([
src + '/js/**/*.js'
]).pipe(plugins.uglify())
)
.pipe(plugins.concat(pkg.name + '.min.js'))
.pipe(gulp.dest(dest + '/js/'));
});
gulp.task('watch', ['build'], function () {
plugins.watch({glob: src + '/js/**/*.js'}, function () {
gulp.start('scripts');
});
});
РЕДАКТИРОВАТЬ: Решено, это было эта проблема. Глобы, начинающиеся с ./
(то есть значение src
), похоже, не работают с ATM.
Ответы
Ответ 1
Изменить: По-видимому gulp.watch
теперь работает с новыми или удаленными файлами. Это не было, когда вопрос был задан.
Остальная часть моего ответа по-прежнему стоит: gulp-watch
обычно является лучшим решением, поскольку оно позволяет выполнять определенные действия только для файлов, которые были изменены, а gulp.watch
позволяет запускать полные задачи. Для проекта разумного размера это быстро станет слишком медленным, чтобы быть полезным.
Вам ничего не хватает. gulp.watch
не работает с новыми или удаленными файлами. Это простое решение, предназначенное для простых проектов.
Чтобы получить просмотр файлов, которые могут искать новые файлы, используйте плагин gulp-watch
, который намного эффективнее. Использование выглядит следующим образом:
var watch = require('gulp-watch');
// in a task
watch({glob: <<glob or array of globs>> })
.pipe( << add per-file tasks here>> );
// if you'd rather rerun the whole task, you can do this:
watch({glob: <<glob or array of globs>>}, function() {
gulp.start( <<task name>> );
});
Лично я рекомендую первый вариант. Это позволяет значительно быстрее обрабатывать файлы. Он отлично работает во время разработки с помощью функции "загрузка", если вы не объединяете файлы.
Вы можете обернуть свои потоки либо с помощью моей lazypipe
библиотеки, либо просто используя функцию и stream-combiner
:
var combine = require('stream-combiner');
function scriptsPipeline() {
return combine(coffeeescript(), uglify(), gulp.dest('/path/to/dest'));
}
watch({glob: 'src/scripts/**/*.js' })
.pipe(scriptsPipeline());
ОБНОВЛЕНИЕ 15 октября 2014 г.
Как указано @pkyeck ниже, очевидно, что релиз 1.0 gulp-watch
слегка изменил формат, поэтому приведенные выше примеры должны быть:
var watch = require('gulp-watch');
// in a task
watch(<<glob or array of globs>>)
.pipe( << add per-file tasks here>> );
// if you'd rather rerun the whole task, you can do this:
watch(<<glob or array of globs>>, function() {
gulp.start( <<task name>> );
});
и
var combine = require('stream-combiner');
function scriptsPipeline() {
return combine(coffeeescript(), uglify(), gulp.dest('/path/to/dest'));
}
watch('src/scripts/**/*.js')
.pipe(scriptsPipeline());
Ответ 2
Оба gulp.watch()
и require('gulp-watch')()
будут запускаться для новых/удаленных файлов, но если вы не используете абсолютные каталоги. В моих тестах я не использовал "./"
для относительных каталогов BTW.
Оба не будут запускаться, если удалены целые каталоги.
var watch = require('gulp-watch');
//Wont work for new files until gaze is fixed if using absolute dirs. It won't trigger if whole directories are deleted though.
//gulp.watch(config.localDeploy.path + '/reports/**/*', function (event) {
//gulp.watch('src/app1/reports/**/*', function (event) {
// console.log('*************************** Event received in gulp.watch');
// console.log(event);
// gulp.start('localDeployApp');
});
//Won't work for new files until gaze is fixed if using absolute dirs. It won't trigger if whole directories are deleted though. See https://github.com/floatdrop/gulp-watch/issues/104
//watch(config.localDeploy.path + '/reports/**/*', function() {
watch('src/krfs-app/reports/**/*', function(event) {
console.log("watch triggered");
console.log(event);
gulp.start('localDeployApp');
//});
Ответ 3
Если src
- абсолютный путь (начиная с /
), ваш код не будет обнаруживать новые или удаленные файлы. Однако есть еще способ:
Вместо:
gulp.watch(src + '/js/**/*.js', ['scripts']);
записи:
gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
и он будет работать!
Ответ 4
В глобусах должен быть указан отдельный базовый каталог, и это базовое местоположение не должно указываться в самом глопе.
Если у вас lib/*.js
, он будет отображаться в текущем рабочем каталоге process.cwd()
Gulp использует Gaze для просмотра файлов, а в Gulp API doc мы видим, что мы можем передавать специальные параметры Gaze на часы функция: gulp.watch(glob[, opts], tasks)
Теперь в Gaze doc мы можем найти, что текущий рабочий каталог (базовый каталог glob) является опцией cwd
.
Что приводит нас к ответу alexk:
gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Ответ 5
Я знаю, что это старый вопрос, но я подумал, что брошу решение, которое я придумал. Ни один из плагинов gulp, которые я нашел, не уведомит меня о новых или переименованных файлах. Таким образом, я закончил обматывание монокласса в удобной функции.
Вот пример использования этой функции:
watch({
root: config.src.root,
match: [{
when: 'js/**',
then: gulpStart('js')
}, {
when: '+(scss|css)/**',
then: gulpStart('css')
}, {
when: '+(fonts|img)/**',
then: gulpStart('assets')
}, {
when: '*.+(html|ejs)',
then: gulpStart('html')
}]
});
Я должен отметить, что gulpStart также является удобной функцией, которую я сделал.
И вот фактический модуль часов.
module.exports = function (options) {
var path = require('path'),
monocle = require('monocle'),
minimatch = require('minimatch');
var fullRoot = path.resolve(options.root);
function onFileChange (e) {
var relativePath = path.relative(fullRoot, e.fullPath);
options.match.some(function (match) {
var isMatch = minimatch(relativePath, match.when);
isMatch && match.then();
return isMatch;
});
}
monocle().watchDirectory({
root: options.root,
listener: onFileChange
});
};
Довольно просто, а? Все это можно найти в моем стартовом комплекте gulp: https://github.com/chrisdavies/gulp_starter_kit
Ответ 6
Важно отметить, что он выглядит как gulp.watch только сообщает об изменениях и удаленных файлах в Windows, но при прослушивании новых и удаленных файлов по умолчанию в OSX:
https://github.com/gulpjs/gulp/issues/675