glob 일치에서 파일을 편집 할 때 다음 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에서 작동하지 않는 것 같습니다.
답변
편집 : 분명히 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>> );
});
개인적으로 첫 번째 옵션을 권장합니다. 이를 통해 파일 단위 프로세스가 훨씬 빨라집니다. 파일을 연결하지 않는 한 livereload로 개발하는 동안 훌륭하게 작동합니다.
내 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());
업데이트 2014 년 10 월 15 일
아래 @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());
답변
모두 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');
//});
답변
경우 src
절대 경로 (로 시작 /
), 코드는 신규 또는 삭제 된 파일을 감지 않을 것입니다. 그러나 여전히 방법이 있습니다.
대신에:
gulp.watch(src + '/js/**/*.js', ['scripts']);
쓰다:
gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
작동합니다!
답변
Glob에는 별도의 기본 디렉토리가 지정되어 있어야하며 해당 기본 위치는 glob 자체에 지정되어서는 안됩니다.
당신이 가지고 있다면 lib/*.js
, 그것은 현재 작업 디렉토리 아래를 볼 것입니다.process.cwd()
Gulp는 Gaze를 사용하여 파일을보고 Gulp API 문서에서 Gaze 특정 옵션을 watch 함수에 전달할 수 있음을 알 수 있습니다.gulp.watch(glob[, opts], tasks)
이제 Gaze 문서 에서 현재 작업 디렉토리 (glob base dir)가 cwd
옵션 이라는 것을 알 수 있습니다.
그러면 alexk의 답변으로 이어집니다.
gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
답변
나는 이것이 오래된 질문이라는 것을 알고 있지만, 내가 생각해 낸 해결책을 던질 것이라고 생각했다. 내가 찾은 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
});
};
아주 간단 해요? 내 걸프 스타터 키트에서 모든 것을 찾을 수 있습니다 : https://github.com/chrisdavies/gulp_starter_kit
답변
gulp.watch는 Windows에서는 변경된 파일과 삭제 된 파일 만보고하지만 OSX에서는 기본적으로 새 파일과 삭제 된 파일을 수신하는 것처럼 보입니다.
답변
gulp.watch 대신 새 / 이름 바꾸기 / 삭제 된 파일에 ‘gulp-watch’를 사용해야합니다.
var gulpwatch = require('gulp-watch');
var source = './assets',
destination = './dest';
gulp.task('copy-changed-assets', function() {
gulpwatch(source+'/**/*', function(obj){
gulp.src( obj.path, { "base": source})
.pipe(gulp.dest(destination));
});
});