tutorial serve instalar grunt example contrib clean gruntjs workflow grunt-contrib-watch grunt-contrib-copy

gruntjs - serve - grunt-contrib-watch



Grunt Watch Event con Grunt Copy solo para archivos modificados (2)

Bien, he estado estancado en esto por 2 semanas, así que espero que alguien más haya encontrado este problema. Intento usar Grunt para copiar solo los archivos que han cambiado. He visto numerosos ejemplos de cómo hacer esto con JSLINT y UGLIFY, pero no hay ejemplos específicos sobre cómo hacer esto con grunt-contrib-copy.

Cuando registra un evento de vigilancia y pasa el nombre de archivo a la subtarea de copia, se puede acceder al nombre del archivo (lo estoy cerrando), pero el archivo nunca se copia correctamente.

Espero que sea algo simple que estoy pasando por alto. ¿Podría alguien echar un vistazo a mi código y ver lo que estoy haciendo mal?

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

Básicamente, la configuración de mi carpeta es la siguiente:

-app | - css | - js -dist

Estoy mirando la carpeta de la aplicación e intento copiar los archivos que cambian en el directorio de la aplicación y los copio en el directorio dist. La modificación dinámica del copy src no parece funcionar.

La tarea de copia cuando se ejecuta solo con watch y no en el evento watch funciona bien y copia todos los archivos, pero estoy interesado en copiar solo los archivos que cambian.

También probé una variación de esto dentro de mi evento de vigilancia, sin éxito:

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

¿Alguien ha hecho esto con éxito antes de usar la copia ronca? ¿O hay otra tarea que debería estar usando? He intentado lo mismo con Gunt-Sync y eso tampoco parece funcionar. Estoy atascado.

Gracias por la ayuda.


Debería poder usar el paquete grunt-newer . Lo único que he notado sobre esto es que no realiza la acción de eliminación si los archivos se eliminan de la fuente y están actualmente en el destino de la copia.

Sin embargo, para la mayoría de los propósitos, esto debería realizar la tarea que estás buscando. El reloj se activará en un cambio de archivo, el más nuevo solo se ejecutará si los archivos en destino son más antiguos que el src .

Nota: nospawn está en desuso, y ahora se spawn . Fue dejado por compatibilidad con versiones anteriores.

No estoy seguro de que tenga sentido que los archivos: [<pattern>] no coincidan con el patrón src descrito en la tarea de copia.

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


Pude usar esta respuesta SO: ¿Cómo se modifican las tareas de reloj gruñido basadas en el archivo? y modificarlo para satisfacer mis necesidades. Ahora puedo copiar solo los archivos que cambiaron.

Mi reloj ahora se ve así:

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

Ahora ejecutando grunt copyChangedFiles observará los cambios en el directorio de la aplicación, y cada vez que se modifique un archivo *.css o *.js , lo copiará en el directorio dist .

Realmente espero que esto ayude a otra persona ya que pasé dos semanas haciendo que esto funcione correctamente.