Gruntjs: Как сделать задачу копирования, чтобы скопировать только измененные файлы на часы

Итак, на странице информации о плагине grunt-contrib-watch есть пример того, как заставить jshint работать только для измененного файла.

grunt.initConfig({
  watch: {
    scripts: {
      files: ['lib/*.js'],
      tasks: ['jshint'],
      options: {
        nospawn: true,
      },
    },
  },
  jshint: {
    all: ['lib/*.js'],
  },
});

grunt.event.on('watch', function(action, filepath) {
  grunt.config(['jshint', 'all'], filepath);
});

Я не проверял пример сам. Но взял это и применил к моей задаче копирования, безуспешно. Задача grunt-contrib-copy создана для копирования изображений и шаблонов для моего углового проекта. И я был бы рад узнать, могу ли я сделать эту работу для задачи копирования, и если я могу, что я делаю неправильно.

Огромное спасибо.

Вот мой раздетый Gruntfile.js.

// Build configurations.
module.exports = function(grunt){

  // Project configuration.
    grunt.initConfig({

      pkg: grunt.file.readJSON('package.json'),

      // Copies directories and files from one location to another.
      copy: {
        // DEVELOPMENT
        devTmpl: {
          files: [{
            cwd     : 'src/tpl/',
            src     : ['**/*'], 
            dest    : 'app/tpl/',
            flatten : false,
            expand  : true
          }]
        },
        devImg: {
          files: [{
            cwd     : 'src/img/',
            src     : ['**/*'], 
            dest    : 'app/img/', 
            flatten : false,
            expand  : true
          }]
        }
      },

      // Watch files for changes and run tasks 
      watch: {
        // Templates, copy
        templates: {
          files : 'src/tpl/**/*',
          tasks : ['copy:devTmpl'],
          options: {
            nospawn: true,
          }
        },
        // Images, copy
        images: {
          files : 'src/img/**/*',
          tasks : ['copy:devImg'],
          options: {
            nospawn: true,
          }
        }
      }

    });

  // Watch events
    grunt.event.on('watch', function(action, filepath) {
      // configure copy:devTmpl to only run on changed file
      grunt.config(['copy','devTmpl'], filepath);
      // configure copy:devImg to only run on changed file
      grunt.config(['copy','devImg'], filepath);
    });

  // PLUGINS:
    grunt.loadNpmTasks('grunt-contrib-copy');


  // TASKS:

    /* DEV: Compiles the app with non-optimized build settings, places the build artifacts in the dist directory, and watches for file changes.
    run: grunt dev */
    grunt.registerTask('dev', 'Running "DEVELOPMENT", watching files and compiling...', [
      'default',
      'watch'
    ]);

    /* DEFAULT: Compiles the app with non-optimized build settings and places the build artifacts in the dist directory.
    run: grunt */
    grunt.registerTask('default', 'Running "DEFAULT", compiling everything.', [
      'copy:devTmpl',
      'copy:devImg'
    ]);

}
 GnrlBzik29 авг. 2014 г., 17:59
Я думаю, что есть возможность использовать более новую задачу.

Ответы на вопрос(2)

Вам нужно указатьgrunt.config к правильному свойству в вашей конфигурации:

grunt.event.on('watch', function(action, filepath) {
  var cfgkey = ['copy', 'devTmpl', 'files'];
  grunt.config.set(cfgkey, grunt.config.get(cfgkey).map(function(file) {
    file.src = filepath;
    return file;
  }));
});
 GnrlBzik14 мая 2013 г., 20:12
кстати, спасибо @ kyle-robinson-young
 GnrlBzik11 дек. 2013 г., 02:23
Спасибо @Dan. Я оптимизировал свою грубую задачу, так что это не так уж и плохо, но я скоро сделаю пересмотр моего скриптового скрипта, потом почесать голову.
 GnrlBzik14 мая 2013 г., 22:22
: / Нет, я думаю, мне придется уйти со сценарием, копирующим все файлы:)
 Kyle Robinson Young14 мая 2013 г., 20:34
О, моя ошибка, я думал, что вы можете установить конфигурацию таким образом Я отредактировал ответ. Попробуйте это вместо этого.
 Dan10 дек. 2013 г., 10:47
@GnrlBzik don 'так быстро сдавайся!
 GnrlBzik14 мая 2013 г., 20:12
Ожидание ... Неустранимая ошибка: у объекта 0 нет метода 'заменить»

https://npmjs.org/package/grunt-sync) вместо grunt-contrib-copy и просмотрите каталоги, которые вы хотите синхронизировать.

Обновление - здесьВот пример:

grunt.initConfig({
  sync: {
    copy_resources_to_www: {
      files: [
        { cwd: 'src', src: 'img/**', dest: 'www' },
        { cwd: 'src', src: 'res/**', dest: 'www' }
      ]
    }
  }
});

cwd означает текущий рабочий каталог. copy_resources_to_www это просто ярлык.

 wawiwa16 апр. 2019 г., 19:36
Это может оказаться полезным, если выre livereload (ing) в папку dist, и вы хотите синхронизировать вашу папку dist в другую отдельную папку:webfoobar.com/node/78
 lordB8r17 янв. 2014 г., 07:10
было бы неплохо, если бы в документах было что-то более полезное для чтения. Grunt-Sync может быть хорошим, но примеры очень тупые.

Ваш ответ на вопрос