2014-10-30 16 views
5

Được rồi Tôi đã bị mắc kẹt trong 2 tuần này, vì vậy hy vọng một người khác ở đây đã chạy qua vấn đề này. Tôi đang cố gắng sử dụng Grunt để sao chép chỉ các tập tin đã thay đổi. Tôi đã nhìn thấy rất nhiều ví dụ về cách làm điều này với JSLINT và UGLIFY nhưng không có ví dụ cụ thể về cách làm điều này với grunt-contrib-copy.Grunt Watch Event với Grunt Copy for Only Changed Files

Khi bạn đăng ký một sự kiện đồng hồ và chuyển tên tệp vào phụ đề sao chép, tên tệp có thể truy cập được (tôi đang đăng xuất), nhưng tệp không bao giờ sao chép đúng cách.

Tôi hy vọng một điều đơn giản mà tôi đang xem. Ai đó có thể vui lòng xem mã của tôi và xem tôi đang làm gì sai?

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

}; 

Về cơ bản thiết lập thư mục của tôi là như vậy:

-app 
| - css 
| - js 
-dist 

Tôi đang xem các thư mục ứng dụng và cố gắng để sao chép các tập tin thay đổi trong thư mục ứng dụng và sao chép chúng vào thư mục dist. Tự động sửa đổi bản sao src dường như không hoạt động.

Tác vụ sao chép khi tự chạy với đồng hồ chứ không phải trên sự kiện đồng hồ chỉ hoạt động tốt và sao chép mọi tệp qua, nhưng tôi chỉ muốn sao chép các tệp thay đổi.

Tôi cũng đã thử một biến thể của sự kiện này trong vòng đồng hồ của tôi, không có kết quả:

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

Có ai làm bao giờ thành công này trước khi sử dụng bản sao grunt? Hoặc có một nhiệm vụ khác mà tôi nên sử dụng không? Tôi đã thử cùng với grunt-đồng bộ và điều đó dường như không hoạt động. Tôi bị kẹt.

Cảm ơn sự giúp đỡ.

Trả lời

1

Tôi đã có thể sử dụng câu trả lời SO này: How to modify grunt watch tasks based on the file changed? và sửa đổi nó cho phù hợp với nhu cầu của tôi. Tôi hiện chỉ có thể sao chép các tệp đã thay đổi.

đồng hồ của tôi bây giờ trông như thế này:

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

}); 

Bây giờ chạy grunt copyChangedFiles sẽ theo dõi các thư mục ứng dụng cho những thay đổi, và bất cứ lúc nào một *.css hoặc *.js tập tin được sửa đổi, nó sẽ sao chép nó sang thư mục dist.

Tôi thực sự hy vọng điều này sẽ giúp người khác vì tôi đã dành hai tuần để điều này hoạt động bình thường.

1

Bạn sẽ có thể sử dụng gói grunt-newer. Điều duy nhất tôi đã nhận thấy về điều này là nó không làm các hành động xóa nếu các tập tin được lấy ra từ nguồn và hiện đang ở đích của bản sao.

Tuy nhiên, đối với hầu hết các mục đích, thao tác này sẽ thực hiện tác vụ mà bạn đang tìm kiếm. Đồng hồ sẽ được kích hoạt khi thay đổi tệp, mới hơn sẽ chỉ chạy nếu tệp ở đích cũ hơn src.

Lưu ý: nospawn không được dùng nữa và hiện là spawn. Nó còn lại cho khả năng tương thích ngược.

Tôi không chắc chắn về các tệp: [<pattern>] không khớp với mẫu src được mô tả trong tác vụ sao chép.

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

}; 
Các vấn đề liên quan