2013-09-09 1 views
4

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

Проблема заключается в том, что она хорошо работает, когда я добавляю/изменяю файл изображения в 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'); 
}; 

Так как удалить конкретный файл в задаче хрюкать-вно-часы? Спасибо за помощь!

ответ

4

Для удаленных событий вы можете удалить все файлы в 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'); 
}; 

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

+0

Хотя это решение кажется немного неэффективным, Я все еще применяю его в своем проекте. Потому что: 1. Эффективность не очень важна для разработки небольшого проекта. 2. Этот метод кажется более модульным. На данный момент я не хочу напрямую обращаться к grunt api. Это помогает, спасибо! – lukeupup

1

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

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

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

1

Я настоятельно рекомендую использовать обертку 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' 

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

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

0

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

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

0

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^