새 파일이나 삭제 된 파일에 대해 gulp.watch가 트리거되지 않습니까?


151

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에서 작동하지 않는 것 같습니다.


2
수락 된 답변을 Nestor Urquiza의 답변으로 변경하면 좋을 것입니다. 플러그인을 추가하는 것이 아니라 여기에 정답입니다
Justin Noel

@alexk의 대답은 가장 간단했으며 다음과 같이 추가 할 필요가 없습니다 gulp-watch. 예gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Horse

답변:


130

편집 : 분명히 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를 처음 사용하고 (Grunt를 두 번 사용했습니다) 아마도 내 주요 작업이 잘못되었을 수 있습니다 ... dunno. 내 업데이트 된 질문을 참조하십시오.
gremo

18
'./'로 시작하지 않는 github.com/floatdrop/gulp-watch/issues/1 globs 내 src 변수는 정확히 '-/'입니다. 문제를 찾았습니다! 감사!
gremo

1
그 버그를 찾아내는 데 아주 좋습니다. 다른 누군가가 그것을 만나면 도움이되기를 바랍니다!
OverZealous

@JHannes 무엇에 답하고 있습니까? 이것이이 답변이 설명하는 것입니다.
OverZealous

2
gulp.start는 비공개 API 메소드에 대한 호출입니다. 작업을 실행하는 다른 방법이 있습니까?
Richard Collette

87

모두 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');
   //});

2
훌륭하고 간단한 답변.
Edgar Martinez

3
yup-너무 많은 펄프 예제 ./가 그들의 길에서 시작됩니다 -실제로 그것은 나쁜 습관처럼 보입니다 -github.com/floatdrop/gulp-watch/issues/1
rmorse

1
감사합니다. 나는 gulp-watch새로운 파일이나 삭제 된 파일을 트리거 하기 위해 제대로 작동 하려고 노력하면서 내 두뇌를 쌓았습니다 . 필요 없음! gulp.watch이것을한다. ./경로에서 모든 것을 제거하면 문제가 해결되었습니다. 대박.
Qodesmith

2
이것은 아마도 정답 일 것입니다-볼 다른 플러그인을 설치하는 것은 정말 환상적이지 않았습니다. 모든 글로브에서 ./를 제거하고 완벽하게 작동했습니다! 감사!
0Neji

1
이것은 가장 좋은 대답이며 추가 모듈이 필요하지 않거나 미친 구문을 이해하지 못합니다.
realappie

57

경우 src절대 경로 (로 시작 /), 코드는 신규 또는 삭제 된 파일을 감지 않을 것입니다. 그러나 여전히 방법이 있습니다.

대신에:

gulp.watch(src + '/js/**/*.js', ['scripts']);

쓰다:

gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);

작동합니다!


12
{ cwd: src }힌트는 내 솔루션이었다. 대단히 감사합니다!
wiredolphin

1
감사합니다 @alexk, {cwd : src}가 내 문제를 해결했습니다.
kaxi1993

@DanielTonon 실수로 파일 배열 안에 넣었습니까? 의 직접적인 매개 변수이어야한다watch

배열에있을 수 없습니까? 글쎄. 제외는 어떻습니까? 소스 파일을 배열에 넣지 않고 제외로 고빙을 수행 할 수 없습니다.
Daniel Tonon

4
좋은 대답입니다. 더 추가하기 위해, 당신이 모든 glob 패턴을 바꾸고 싶지 않다면, glob 패턴을 그대로 추가 {cwd:'./'}하고 그대로 두십시오gulp.watch('src/js/**/*.js', {cwd: './'}, ['scripts']);
Akash

7

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']);


3

나는 이것이 오래된 질문이라는 것을 알고 있지만, 내가 생각해 낸 해결책을 던질 것이라고 생각했다. 내가 찾은 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


1
친구여, 충분한 사람들이 이것에 대한 소품을 제공하지 않았습니다! 그것은 매력처럼 작동합니다. 대단히 감사합니다. (답은 "gulpStart"의 기능을 생략하므로, 누군가 관심이 있다면 링크를 방문하여 utils폴더로 이동 하면 혼란 스러울 수 있습니다 )
Augie Gardner


0

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));
    });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.