2014-10-30 21 views
5

Okej, utknąłem na tym przez 2 tygodnie, więc mam nadzieję, że ktoś inny przeszedł przez ten problem. Próbuję użyć Grunta do skopiowania tylko plików, które się zmieniły. Widziałem liczne przykłady tego, jak to zrobić z JSLINT i UGLIFY, ale nie ma konkretnych przykładów, jak to zrobić z grunt-contrib-copy.Grunt Watch Event z Grnt Copy dla tylko zmienionych plików

Po zarejestrowaniu zdarzenia oglądania i przesłaniu nazwy pliku do podzadania kopii nazwa pliku jest dostępna (wylogowuję się), ale plik nie jest prawidłowo kopiowany.

Mam nadzieję, że jest to prosta rzecz, którą przeoczyłem. Czy ktoś mógłby rzucić okiem na mój kod i zobaczyć, co robię źle?

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

}; 

Zasadniczo moja konfiguracja folder jest jako takie:

-app 
| - css 
| - js 
-dist 

patrzę folder aplikacji i próbuje skopiować pliki, które zmieniają się w katalogu aplikacji i skopiuj je do katalogu dist. Dynamiczne modyfikowanie src kopii wydaje się nie działać.

Zadanie kopiowania po uruchomieniu z zegarem, a nie z zegarka działa dobrze i kopiuje każdy plik, ale jestem zainteresowany kopiowaniem tylko tych plików, które się zmieniają.

Próbowałem również odmianę tego w moim przypadku zegarka, bezskutecznie:

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

Czy ktoś kiedykolwiek udało się zrobić to przed użyciem grunt kopię? Czy jest jeszcze inne zadanie, którego powinienem użyć? Próbowałem tego samego z gruntową synchronizacją i to też nie działa. Utknąłem.

Dzięki za pomoc.

Odpowiedz

1

Mogłem użyć tej odpowiedzi SO: How to modify grunt watch tasks based on the file changed? i zmodyfikować ją zgodnie z moimi potrzebami. Teraz mogę skopiować tylko zmienione pliki.

Mój zegarek wygląda teraz tak:

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

}); 

Teraz działa grunt copyChangedFiles będzie oglądać katalog aplikacja do zmiany, a każdym razem, gdy plik *.css lub *.js modyfikowaną, to będzie skopiować go do katalogu dist.

Naprawdę mam nadzieję, że to pomoże komuś innemu, ponieważ spędziłem dwa tygodnie, żeby to działało prawidłowo.

1

Powinieneś być w stanie użyć pakietu grunt-newer. Jedyne, co zauważyłem, to to, że nie usuwa akcji, jeśli pliki są usuwane ze źródła i znajdują się w miejscu docelowym kopii.

Jednak dla większości zastosowań powinno to wykonać zadanie, którego szukasz. Zegarek zostanie uruchomiony po zmianie pliku, nowsze będą działać tylko wtedy, gdy pliki docelowe są starsze niż src.

Uwaga: nospawn jest przestarzałe i obecnie jest to spawn. Zostało to dla kompatybilności wstecznej.

Nie jestem pewien, czy ma sens, aby pliki: [<pattern>] nie pasowały do ​​wzorca opisanego w zadaniu kopiowania 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']); 

}; 
Powiązane problemy