5

Okay, ich bin seit 2 Wochen dabei, also hoffentlich ist hier jemand anderes auf dieses Problem gestoßen. Ich versuche mit Grunt nur Dateien zu kopieren, die sich geändert haben. Ich habe zahlreiche Beispiele gesehen, wie man das mit JSLINT und UGLIFY macht, aber keine konkreten Beispiele dafür, wie man das mit grunt-contrib-copy macht.Grunt Watch Event mit Grunt Copy für nur geänderte Dateien

Wenn Sie ein Überwachungsereignis registrieren und den Dateinamen an die Kopie-Unteraufgabe übergeben, können Sie auf den Dateinamen zugreifen (ich melde mich ab), aber die Datei wird niemals ordnungsgemäß kopiert.

Ich hoffe, es ist eine einfache Sache, die ich übersehe. Könnte jemand bitte meinen Code ansehen und sehen, was ich falsch mache?

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

}; 

Grundsätzlich meine Ordner Setup ist als solche:

-app 
| - css 
| - js 
-dist 

ich die app Ordner gucke und versuchen, Dateien zu kopieren, die im App-Verzeichnis zu ändern, und kopieren Sie sie in das Verzeichnis dist. Es scheint nicht zu funktionieren, die Kopie src dynamisch zu modifizieren.

Die Kopie Aufgabe, wenn sie selbst mit Uhr und nicht auf der Uhr Veranstaltung läuft funktioniert gut und kopiert jede Datei über, aber ich bin nur daran interessiert, nur Dateien zu kopieren, die sich ändern.

Ich habe auch versucht, eine Variation dieses innerhalb meiner Uhr Veranstaltung, ohne Erfolg:

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

Hat jemand schon einmal dies erfolgreich getan, bevor Grunzen Kopie verwenden? Oder gibt es eine andere Aufgabe, die ich verwenden sollte? Ich habe das gleiche mit grunt-sync versucht und das schien auch nicht zu funktionieren. Ich stecke fest.

Danke für die Hilfe.

Antwort

1

Ich konnte diese SO Antwort verwenden: How to modify grunt watch tasks based on the file changed? und ändern sie an meine Bedürfnisse anzupassen. Ich bin jetzt in der Lage, nur die Dateien zu kopieren, die sich geändert haben.

Meine Uhr sieht nun wie folgt aus:

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

}); 

Jetzt grunt copyChangedFiles läuft das App-Verzeichnis für Änderungen beobachten und jederzeit eine *.css oder *.js Datei geändert wird, es es über zum dist Verzeichnis kopiert.

Ich hoffe wirklich, dass dies jemand anderem hilft, da ich zwei Wochen damit verbracht habe, das richtig zu machen.

1

Sie sollten in der Lage sein, das grunt-newer Paket zu verwenden. Das einzige, was mir dabei aufgefallen ist, ist, dass es die Löschaktion nicht ausführt, wenn die Dateien aus der Quelle entfernt werden und sich gerade im Ziel der Kopie befinden.

Für die meisten Zwecke sollte dies jedoch die Aufgabe ausführen, die Sie suchen. Watch wird bei einer Dateiänderung ausgelöst, neuere werden nur ausgeführt, wenn die Dateien im Ziel älter als src sind.

Hinweis: nospawn ist veraltet und ist jetzt spawn. Es wurde für Rückwärtskompatibilität gelassen.

Ich bin nicht sicher, ob es für Dateien sinnvoll ist: [<pattern>] nicht mit dem src Muster in der Kopieraufgabe übereinstimmen.

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

};