Gulps gulp.watch không được kích hoạt cho các tập tin mới hoặc bị xóa?


151

Tác vụ Gulpjs sau hoạt động tốt khi chỉnh sửa tệp trong trận đấu toàn cầu:

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

Tuy nhiên, nó không hoạt động (nó không được kích hoạt) cho các tệp mới hoặc bị xóa. Có thiếu điều gì không?

EDIT : ngay cả khi sử dụng plugin grunt-watch, nó dường như không hoạt động:

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

EDIT : Đã giải quyết, đó là vấn đề này . Quả cầu bắt đầu bằng ./(đó là giá trị của src) dường như ATM không hoạt động.


2
Sẽ thật tuyệt nếu bạn thay đổi câu trả lời được chấp nhận thành câu trả lời từ Nestor Urquiza. Đây là câu trả lời thực sự ở đây thay vì thêm một plugin bổ sung
Justin Noel

câu trả lời của @alexk là đơn giản nhất và không yêu cầu thêm vào gulp-watch, ví dụ:gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);
Horse

Câu trả lời:


130

Chỉnh sửa: Rõ ràng gulp.watchkhông làm việc với các tập tin mới hoặc xóa bây giờ. Nó đã không khi câu hỏi được hỏi.

Phần còn lại của câu trả lời của tôi vẫn là: gulp-watchthường là một giải pháp tốt hơn vì nó cho phép bạn thực hiện các hành động cụ thể chỉ trên các tệp đã được sửa đổi, trong khi gulp.watchchỉ cho phép bạn chạy các tác vụ hoàn chỉnh. Đối với một dự án có quy mô hợp lý, điều này sẽ nhanh chóng trở nên quá chậm để có ích.


Bạn không thiếu thứ gì. gulp.watchkhông hoạt động với các tập tin mới hoặc bị xóa. Đó là một giải pháp đơn giản được thiết kế cho các dự án đơn giản.

Để có được ngắm tập tin đó có thể tìm kiếm tập tin mới, sử dụng các gulp-watchPlugin , đó là mạnh hơn rất nhiều. Cách sử dụng trông như thế này:

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>> );
});

Cá nhân, tôi khuyên bạn nên lựa chọn đầu tiên. Điều này cho phép các quy trình trên mỗi tệp nhanh hơn nhiều. Nó hoạt động rất tốt trong quá trình phát triển với tải gan miễn là bạn không ghép bất kỳ tệp nào.

Bạn có thể kết thúc các luồng của mình bằng thư viện của tôilazypipe hoặc đơn giản là sử dụng một hàm và stream-combinernhư thế này:

var combine = require('stream-combiner');

function scriptsPipeline() {
    return combine(coffeeescript(), uglify(), gulp.dest('/path/to/dest'));
}

watch({glob: 'src/scripts/**/*.js' })
        .pipe(scriptsPipeline());

CẬP NHẬT ngày 15 tháng 10 năm 2014

Như được chỉ ra bởi @pkyeck bên dưới, rõ ràng bản phát hành 1.0 gulp-watchđã thay đổi định dạng một chút, vì vậy các ví dụ trên bây giờ sẽ là:

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());

Cảm ơn đã giúp đỡ nhưng vẫn không thể làm cho nó hoạt động. Tôi mới sử dụng Gulp (tôi đã sử dụng Grunt một vài lần) và có lẽ nhiệm vụ chính của tôi là sai ... dunno. Xem câu hỏi cập nhật của tôi.
gremo

18
github.com/floatdrop/gulp-watch/issues/1 ảm đạm bắt đầu bằng './' không phát ra. Biến src của tôi chính xác là '- /'. Tìm thấy vấn đề! Cảm ơn!
Gremo

1
Bắt tốt khi tìm thấy lỗi đó. Hy vọng nó sẽ giúp nếu có ai khác đi qua nó!
OverZealous

@JHannes Bạn đang trả lời cái gì? Đó là những gì câu trả lời này đang giải thích.
OverZealous

2
gulp.start là một cuộc gọi đến một phương thức API không công khai. Có cách nào khác để thực hiện các nhiệm vụ?
Richard Collette

87

Cả hai gulp.watch()require('gulp-watch')()sẽ kích hoạt cho các tập tin mới / bị xóa tuy nhiên không nếu bạn sử dụng các thư mục tuyệt đối. Trong các thử nghiệm của tôi, tôi đã không sử dụng "./"cho các thư mục tương đối BTW.

Cả hai sẽ không kích hoạt nếu toàn bộ thư mục bị xóa.

   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
Câu trả lời tuyệt vời và đơn giản.
Edgar Martinez

3
yup - rất nhiều ví dụ gulp ngoài kia bắt đầu bằng ./con đường của họ - thực sự có vẻ như đó là một thực tiễn tồi - github.com/floatdrop/gulp-watch/issues/1
rmorse

1
Cảm ơn vì điều này. Tôi chỉ làm rối trí não của mình để cố gắng gulp-watchlàm việc đúng cách để kích hoạt các tập tin mới hoặc các tập tin bị xóa. Không cần! gulp.watchthực hiện điều này. Loại bỏ tất cả ./từ các đường dẫn xóa các vấn đề. Tuyệt vời.
Qodesmith

2
Đây có lẽ nên là câu trả lời đúng - không thực sự thích cài đặt một plugin khác để xem. Đã xóa ./ khỏi tất cả các khối của tôi và hoạt động hoàn hảo! Cảm ơn!
0Neji

1
Đây là câu trả lời tốt nhất, không cần thêm mô-đun hoặc hiểu về cú pháp điên.
realappie

57

Nếu srclà một đường dẫn tuyệt đối (bắt đầu bằng /), mã của bạn sẽ không phát hiện các tệp mới hoặc bị xóa. Tuy nhiên vẫn còn một cách:

Thay vì:

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

viết:

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

và nó sẽ hoạt động!


12
Các { cwd: src }gợi ý là giải pháp của tôi. Cảm ơn rât nhiều!
Wiredolphin

1
Cảm ơn rất nhiều @alexk, {cwd: src} đã giải quyết vấn đề của tôi.
kaxi1993

@DanielTonon bạn đã đưa vào bên trong một loạt các tập tin do nhầm lẫn? phải là một tham số trực tiếp củawatch
Ngựa

Nó không thể ở trong một mảng? Vâng, đó là hút. Còn loại trừ thì sao? Không thể thực hiện việc ngấu nghiến bằng các loại trừ mà không đặt các tệp nguồn vào một mảng.
Daniel Tonon

4
Câu trả lời chính xác. Để thêm nữa, nếu bạn không muốn thay đổi mọi mẫu hình cầu, chỉ cần thêm {cwd:'./'}và để nguyên mẫu toàn cầu như vậygulp.watch('src/js/**/*.js', {cwd: './'}, ['scripts']);
Akash

7

Các quả cầu phải có một thư mục cơ sở riêng được chỉ định và vị trí cơ sở đó không được chỉ định trong chính quả cầu.

Nếu bạn có lib/*.js, nó sẽ xem dưới thư mục làm việc hiện tạiprocess.cwd()

Gulp sử dụng Gaze để xem các tệp và trong tài liệu API Gulp, chúng tôi thấy rằng chúng tôi có thể chuyển các tùy chọn cụ thể của Gaze cho chức năng xem:gulp.watch(glob[, opts], tasks)

Bây giờ trong tài liệu Gaze chúng ta có thể thấy rằng thư mục làm việc hiện tại (thư mục cơ sở toàn cầu) là cwdtùy chọn.

Điều này dẫn chúng ta đến câu trả lời của alexk: gulp.watch('js/**/*.js', {cwd: src}, ['scripts']);


3

Tôi biết đây là một câu hỏi cũ hơn, nhưng tôi nghĩ tôi đã đưa ra giải pháp mà tôi đã đưa ra. Không có plugin nào tôi tìm thấy sẽ thông báo cho tôi về các tệp mới hoặc được đổi tên. Vì vậy, tôi đã kết thúc gói monocle trong một chức năng thuận tiện.

Đây là một ví dụ về cách sử dụng chức năng đó:

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

Tôi nên lưu ý rằng gulpStart cũng là một chức năng tiện lợi tôi đã thực hiện.

Và đây là mô-đun đồng hồ thực tế.

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
  });
};

Khá đơn giản nhỉ? Toàn bộ điều có thể được tìm thấy tại bộ khởi động gulp của tôi: https://github.com/chrisdavies/gulp_starter_kit


1
Này anh bạn, không đủ người đã tặng đạo cụ cho việc này! Nó hoạt động như một lá bùa, cảm ơn bạn rất nhiều. (Câu trả lời lá ra những gì "gulpStart" không, vì vậy nó có thể gây nhầm lẫn, nếu có ai quan tâm, chỉ cần truy cập vào liên kết và đầu vào utilsthư mục)
Augie Gardner


0

Bạn nên sử dụng 'gulp-watch' cho các tệp mới / đã đổi tên / đã xóa thay vì 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));
    });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.