Grunt - как смотреть и синхронизировать удаление файлов

Я новый пользователь Grunt. В настоящее время у меня есть папка static_src/img, которая содержит исходные файлы изображений (.psd) и файлы изображений (.png, .jpg и т. д.). Эта папка не является общедоступной. Вместо этого я хочу синхронизировать изменение только файлов изображений с другой общей папкой static/img.

Проблема в том, что он хорошо работает, когда я добавляю/изменяю файл изображения в static_src/img, но я не знаю, как синхронизировать изменение при удалении файла. Grunt-contrib-watch может обнаружить удаление в static_src/img, но я не знаю, как удалить файл в static/img. Я попробовал grunt-contrib-clean, но у меня это не работает, может быть, я использовал его неправильно.

Мой Gruntfile.js:

module.exports = function(grunt){
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    copy: {
      dev: {
        files: [
          {expand: true, cwd: 'static_src/img/', src:['**/*.{png,jpg,gif}'], dest: 'static/img/'}
        ]
      }
    },
    clean: {
      dev: {
        src: ['static_src/img/**/*.png']
      }
    },
    watch: {
      copy: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['copy'],
        options: {
          event: ['added', 'changed'],
        }
      },
      remove: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['clean'],
        options: {
          event: ['deleted']
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-watch');
};

Итак, как удалить конкретный файл в задаче grunt-contrib-watch? Спасибо за помощь!


person lukeupup    schedule 09.09.2013    source источник


Ответы (7)


Для удаленного события вы можете удалить все файлы из static/img и скопировать оставшиеся файлы из static_src/img в static/img.

module.exports = function(grunt){
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    copy: {
      dev: {
        files: [
          {expand: true, cwd: 'static_src/img/', src:['**/*.{png,jpg,gif}'], dest: 'static/img/'}
        ]
      }
    },
    clean: {
      dev: {
        src: ['static/img/**/*.{png,jpg,gif}']    // Changed this from static_src to static
      }
    },
    watch: {
      copy: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['copy'],
        options: {
          event: ['added', 'changed'],
        }
      },
      remove: {
        files: ['static_src/img/**/*.{png,jpg,gif}'],
        tasks: ['clean', 'copy'],    // Added copy task after clean
        options: {
          event: ['deleted']
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-clean');
  grunt.loadNpmTasks('grunt-contrib-watch');
};

Я предполагаю, что это может отличаться от того, что вы ожидали для удаления определенного файла, но работает так, как ожидалось.

person eqot    schedule 09.09.2013
comment
Хотя это решение кажется немного неэффективным, я все же применяю его в своем проекте. Потому что: 1. Эффективность не очень важна для разработки небольшого проекта. 2. Этот метод кажется более модульным. На данный момент я не хочу напрямую вызывать grunt api. Это помогает, спасибо! - person lukeupup; 13.09.2013

Grunt имеет файловый API, который вы можете использовать с событиями, поэтому вы можете написать функцию удаления, которая запускается когда данный просматриваемый файл удаляется:

grunt.event.on('watch', function(action, filepath, target) {
  if (action === 'deleted') {
    grunt.file.delete(fileToDelete);
  } 
});

Путь к файлу передается, поэтому вы можете сделать что-то вроде регулярного выражения, чтобы получить имя файла и добавить к нему соответствующий путь (при необходимости).

person max    schedule 09.09.2013

Я настоятельно рекомендую использовать оболочку nodejs watch, которая кажется более стабильной (в декабре 2013 года) и универсальной, чем родная fs.watch/fs.watchFile.

https://github.com/paulmillr/chokidar

Вкусная вещь — это еще и его API:

  .on('add'
  .on('addDir'
  .on('change'
  .on('unlink'
  .on('unlinkDir'
  .on('error'

Мои приблизительные тесты не показывают проблем с производительностью при использовании этого модуля.

Конечно, это не готовый ответ на ваш вопрос, а подсказка. Надеюсь, поможет.

person Dan    schedule 10.12.2013

Для этого я поставил задачу:

https://github.com/taylorcode/grunt-delete-sync

Надеюсь это поможет. Остерегайтесь разрушительной природы.

person TaylorMac    schedule 05.02.2014

Попробуйте мой дубликат, который может соответствовать вашим потребностям.

Он удалит файл назначения, если источник будет удален, а также удалит пустые папки после удаления его содержимого.

person vilicvane    schedule 06.01.2015

Используя grunt-rsync вместо задачи копирования, вы можете синхронизировать удаление файлов с помощью параметр удаления.

person Richard Kiefer    schedule 29.03.2015

Это старый вопрос, но для тех, кто зайдет сюда в 2016 году или позже, теперь есть задача grunt-sync, которая выполняет полную синхронизацию, включая удаление файлов: https://github.com/tomusdrw/grunt-синхронизация

person AsGoodAsItGets    schedule 14.07.2016