5

Хорошо, я застрял на этом в течение 2 недель, так что, надеюсь, кто-то другой столкнулся с этой проблемой. Я пытаюсь использовать Grunt для копирования только файлов, которые были изменены. Я видел многочисленные примеры того, как это сделать с JSLINT и UGLIFY, но нет конкретных примеров того, как это сделать с помощью grunt-contrib-copy.Событие Grunt Watch с грубым копированием только для измененных файлов

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

Я надеюсь, что это простая вещь, с которой я не обращаю внимания. Может кто-нибудь, пожалуйста, взгляните на мой код и посмотрите, что я делаю неправильно?

//Gruntfile.js: 

module.exports = function(grunt) { 
grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    options: { 
     base: 'app', 
     dist: 'dist', 
    }, 

    copy: { 
     changedFiles: { 
      expand: true, 
      dot: true, 
      cwd: '<%= options.base %>', 
      src: ['**/*.*'], 
      dest: '<%= options.dist %>/' 

     } 
    }, 
    watch: { 
     options: { 
      nospawn: true, 
      //debounceDelay: 1000, 
     }, 
     css: { 
      files: ['app/css/*.css', 
        'app/js/*.js' 
        ], 
      tasks: ['copy:changedFiles'], 

     } 
    }  

}); 

grunt.event.on('watch', function(action, filepath, target){ 
    grunt.log.writeln('target: ', target + '\n filepath: ' + filepath + '\n action: has ' + action); 
    grunt.config('copy.changedFiles.src', new Array(filepath)); 
}); 

//load our copy task 
grunt.loadNpmTasks('grunt-contrib-copy'); 

//load our watch task 
grunt.loadNpmTasks('grunt-contrib-watch'); 

grunt.registerTask('copyChangedFiles', [ 
     'watch:css' 
]); 

}; 

В основном моя установка папки как таковой:

-app 
| - css 
| - js 
-dist 

Я смотрю папку приложения и пытается копировать файлы, которые изменяются в каталоге приложения и скопировать их в DIST каталог. Динамическое изменение копии src, похоже, не работает.

Задача копирования при запуске сама по себе с часами, а не на часах, работает нормально и копирует все файлы, но меня интересует копирование только файлов, которые меняются.

Я также попытался вариацию это в моем случае часов, но безрезультатно:

var copyDest = filepath.replace(grunt.config('copy.changedFiles.dest'), ''); 
var copyCwd = filepath.replace(grunt.config('copy.changedFiles.cwd'), ''); 
grunt.config('copy.changedFiles.cwd' , copyCwd); 
grunt.config(['copy', 'changedFiles', 'src'] , [filepath]); 

Кто-нибудь успешно сделал это, прежде чем использовать черновую копию? Или есть еще одна задача, которую я должен использовать? Я пробовал то же самое с grunt-sync, и это тоже не сработало. Я застрял.

Спасибо за помощь.

ответ

1

Я смог использовать этот ответ: How to modify grunt watch tasks based on the file changed? и изменить его в соответствии с моими потребностями. Теперь я могу скопировать только те файлы, которые изменились.

Мои часы теперь выглядит следующим образом:

var path = require('path'); 

grunt.event.on('watch', function(action, filepath, target){ 
    grunt.log.writeln(target + ': ' + filepath + ' might have ' + action); 
    var siteDirectory = path.dirname(filepath); 

    //changes changed file source to that of the changed file 
    var option = 'copy.changedFiles.src'; 
    var result = filepath; 
    grunt.log.writeln(option + ' changed to ' + result); 
    grunt.config(option, result); 

    //customizes output directory so that file goes to correct place 
    option = 'copy.changedFiles.dest'; 
    result = path.resolve(__dirname + '/dist'); 
    grunt.log.writeln(option + ' changed to ' + result); 
    grunt.config(option, result); 

}); 

Сейчас работает grunt copyChangedFiles будет смотреть каталог приложений для изменений, и каждый раз, когда *.css или *.js файл модифицируется, он будет скопировать его в каталог dist.

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

1

Вы должны иметь возможность использовать пакет grunt-newer. Единственное, что я заметил об этом, это то, что он не выполняет действие удаления, если файлы удалены из источника и в настоящее время находятся в месте назначения копии.

Однако для большинства целей это должно выполнить задачу, которую вы ищете. Наблюдение будет инициировано при изменении файла, новее будет работать только в том случае, если файлы в месте назначения старше, чем src.

Примечание: nospawn устарел, и теперь spawn. Он был оставлен для обратной совместимости.

Я не уверен, что это имеет смысл для файлов: [<pattern>], чтобы не соответствовать шаблону src, описанному в задаче копирования.

module.exports = function(grunt) { 
grunt.initConfig({ 
    options: { 
     base: 'app', 
     dist: 'dist', 
    }, 
    copy: { 
     changedFiles: { 
      expand: true, 
      dot: true, 
      cwd: '<%= options.base %>', 
      src: ['**/*.*'], 
      dest: '<%= options.dist %>/' 
     } 
    }, 
    watch: { 
     options: { 
      //nospawn is depricated but kept for compatibility. use spawn false instead 
      spawn: false, 
      cwd: '<%= options.base %>' 
      //debounceDelay: 1000, 
     }, 
     css: { 
      //should match above 
      files: ['**/*.*'], 
      //On new file detection run copy:changedFiles 
      tasks: ['newer:copy:changedFiles'] 
     } 
    }  
}); 

grunt.loadNpmTasks('grunt-contrib-copy'); 
grunt.loadNpmTasks('grunt-contrib-watch'); 
grunt.loadNpmTasks('grunt-newer'); 

grunt.registerTask('copyChangedFiles', ['watch:css']); 

};