2013-07-29 33 views
5

Tôi đang viết một chương trình node.js sẽ xem một thư mục chứa một số lượng lớn (300-ish) số dự án scss. Grunt-watch (chạy qua mô-đun nút hoặc trên chính nó, bất kỳ công trình nào) sẽ được cấu hình sao cho bất cứ khi nào một tệp scss được thay đổi, nó sẽ được biên dịch với la bàn, tệp đầu ra được chuyển đến một thư mục riêng biệt, ví dụ:Làm thế nào để sửa đổi các tác vụ theo dõi grunt dựa trên tệp đã thay đổi?

./1234/style.scss được đổi >> grunt-đồng hồ chạy grunt-la bàn >> /foo/bar/baz/1234/style.css cập nhật

thư mục dự án mà tập tin là trong rõ ràng là rất quan trọng (nếu grunt-la bàn gửi tất cả các tập tin được biên dịch vào cùng một thư mục, chúng sẽ lộn xộn và không sử dụng được và tự động hóa grunt sẽ không có mục đích). Tôi đặt hàng để đảm bảo tất cả các tệp được định tuyến đến đúng địa điểm, tôi tự động thay đổi cài đặt grunt-la bàn mỗi khi tệp css được cập nhật.

mẫu gruntfile:

module.exports = function(grunt) { 

grunt.initConfig({ 
    pkg: grunt.file.readJSON('package.json'), 
    watch: { 
     files: './*/*.scss', 
     tasks: ['compass'] 
    }, 
    compass: { 
     origin:{ 
     options: { 
      //temportary settings to be changed later 
      sassDir: './', 
      cssDir: './bar', 
      specify: './foo.scss' 
     } 
     } 
    } 
    }); 

    grunt.loadNpmTasks('grunt-contrib-watch'); 
    grunt.loadNpmTasks('grunt-contrib-compass'); 

    grunt.event.on('watch', function(action, filepath, target) { 
    var path = require('path'); 
    grunt.log.writeln(target + ': ' + filepath + ' might have ' + action); 
    var siteDirectory = path.dirname(filepath); 

    //changes sass directory to that of the changed file 
    var option = 'compass.origin.options.sassDir'; 
    var result = __dirname + '/' + siteDirectory; 
    grunt.log.writeln(option + ' changed to ' + result); 
    grunt.config(option, result); 

    //customizes css output directory so that file goes to correct place 
    option = 'compass.origin.options.cssDir'; 
    result = path.resolve(__dirname, '../', siteDirectory); 
    grunt.log.writeln(option + ' changed to ' + result); 
    grunt.config(option, result); 

    //grunt.task.run(['compass']); 

    }); 

}; 

Tuy nhiên điều này không hoạt động. Nếu bạn chạy 'grunt watch' ở chế độ tiết, bạn sẽ thấy rằng grunt chạy cả hàm grunt.event.on và nhiệm vụ đồng hồ trong các tiến trình riêng biệt. Phân tích cú pháp thứ hai của gruntfile reverts tất cả event.on config của tôi sẽ thay đổi thành mặc định ở trên, và la bàn không chạy được.

Như đã thấy trong event.on, tôi đã cố gắng thêm grunt.task.run() để đảm bảo rằng la bàn được chạy trong cùng một quá trình với chức năng event.on, sẽ giữ nguyên các thay đổi cấu hình của tôi. Tuy nhiên, nhiệm vụ từ chối chạy, có khả năng là vì I'm doing it wrong. Không may, các biến grunt.event.on không được gửi đến tác vụ grunt-watch đã xác định, nếu không tôi có thể viết một hàm tùy chỉnh sẽ thay đổi cài đặt la bàn và sau đó chạy la bàn trong cùng một quá trình.

Tôi đã thử triển khai thực hiện điều này mà không cần sử dụng chức năng đồng hồ tích hợp vào la bàn, tuy nhiên la bàn chỉ có thể lưu trữ một đường dẫn đầu ra tĩnh cho mỗi dự án và chỉ có thể xem một dự án cùng một lúc.

Tôi hiện đang gặp vấn đề này bằng cách thêm chương trình nút lấy tên trang là tham số, viết lại grunfile.js bằng cách chạy bằng fs và sau đó chạy 'grunt watch' thông qua hàm exec. Tuy nhiên điều này có nhược điểm riêng của nó (tôi không thể xem dữ liệu grunt.log) và được phức tạp khủng khiếp, vì vậy tôi muốn thay đổi nó.

Cảm ơn bạn rất nhiều vì bất kỳ thông tin chi tiết nào.

+0

Điều này không trả lời được câu hỏi của bạn nhưng tại sao lại có một chiếc đồng hồ vui nhộn cho la bàn? Compass đã đi kèm với 'compass watch' – pllee

+0

Bạn cần phải chỉ định' options: {nospawn: true} 'trong cấu hình nhiệm vụ đồng hồ của bạn để có' watch' chạy trong cùng một ngữ cảnh ([xem phần này trong tài liệu] (https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed)). –

+0

@ go-oleg Cảm ơn bạn! Điều đó làm việc tuyệt vời. Tôi ngạc nhiên vì tôi không thấy điều đó trong tài liệu, vì nó trực tiếp tuyên bố rằng 'nospawn' giải quyết các vấn đề như tôi. – anachronism

Trả lời

11

Bạn cần phải xác định

options : { nospawn : true }

trong hồ nhiệm vụ cấu hình của bạn để có thời gian đồng hồ trong bối cảnh tương tự:

watch: { 
    files: './*/*.scss', 
    tasks: ['compass'], 
    options : { nospawn : true } 
} 

Xem this section của tài liệu để biết thêm về vấn đề này.

+0

Đánh giá cao câu trả lời này. Đã đọc tài liệu nhưng không rõ ràng về ý nghĩa của "ngữ cảnh" và cách nó bị ảnh hưởng bởi tùy chọn 'nospawn'. Cảm ơn! – jerome

+0

Cảm ơn bạn đã trả lời! – vgrinko

+2

Để thêm bản cập nhật cho câu trả lời này, tính đến tháng 6 năm 2016, tùy chọn bây giờ là: 'spawn: false' – BigHeadCreations

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