2014-10-30 19 views
5

Okay Sono stato bloccato su questo per 2 settimane, quindi spero che qualcun altro qui si sia imbattuto in questo problema. Sto cercando di usare Grunt per copiare solo i file che sono cambiati. Ho visto numerosi esempi su come farlo con JSLINT e UGLIFY ma nessun esempio specifico su come farlo con grunt-contrib-copy.Evento Grunt Watch con copia Grunt solo per file modificati

Quando si registra un evento di controllo e si passa il nome file alla sottotabella di copia, il nome del file è accessibile (lo sto disconnettendo), ma il file non viene mai copiato correttamente.

Spero che sia una cosa semplice che sto trascurando. Qualcuno potrebbe dare un'occhiata al mio codice e vedere cosa sto facendo male?

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

}; 

Fondamentalmente il mio impostazione della cartella in quanto tale:

-app 
| - css 
| - js 
-dist 

sto guardando la cartella applicazione e cercando di copiare i file che cambiano nella directory app e copiarli nella directory dist. La modifica dinamica della copia src non sembra funzionare.

L'attività di copia quando viene eseguita da sola con l'orologio e non sull'evento orologio funziona correttamente e copia tutti i file, ma sono interessato a copiare solo i file che cambiano.

ho provato anche una variante di questo evento nel mio orologio, senza alcun risultato:

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

Qualcuno ha fatto mai successo questo prima di utilizzare la copia grugnito? O c'è un altro compito che dovrei usare? Ho provato lo stesso con grunt-sync e non sembrava funzionare. Sono bloccato.

Grazie per l'aiuto.

risposta

1

Sono stato in grado di utilizzare questa risposta SO: How to modify grunt watch tasks based on the file changed? e modificarlo in base alle mie esigenze. Ora sono in grado di copiare solo i file modificati.

Il mio orologio ora assomiglia a questo:

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

}); 

Ora esecuzione grunt copyChangedFiles guarderà la cartella app per le modifiche, e ogni volta che un file *.css o *.js viene modificata, sarà copiarlo nella directory dist.

Spero davvero che questo aiuti qualcun altro da quando ho trascorso due settimane a farlo funzionare correttamente.

1

Dovresti essere in grado di utilizzare il pacchetto grunt-newer. L'unica cosa che ho notato su questo è che non fa l'azione di cancellazione se i file vengono rimossi dalla fonte e sono attualmente nella destinazione della copia.

Tuttavia, per la maggior parte degli scopi questo dovrebbe eseguire l'attività che si sta cercando. L'orologio verrà attivato in caso di cambio di file, più recente verrà eseguito solo se i file nella destinazione sono precedenti allo src.

Nota: nospawn obsoleto ed è ora spawn. È stato lasciato per compatibilità all'indietro.

Non sono sicuro che abbia senso per i file: [<pattern>] non corrispondono al modello src descritto nell'attività di 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']); 

}; 
Problemi correlati