2013-02-25 54 views
11

मेरी परियोजना में 300 से अधिक कॉफीस्क्रिप्ट फाइलें हैं, इसलिए सब कुछ पुनः संयोजित करने में कई सेकंड लगते हैं। मैं केवल बदली गई कॉफीस्क्रिप्ट फ़ाइलों को पुन: संकलित करना चाहता हूं।मैं बदली-कॉन्ट्रिब-कॉफी के साथ गंदगी-संबंध का उपयोग कैसे कर सकता हूं केवल परिवर्तित करने के लिए। कॉफी फाइलों को संकलित करने के लिए?

यहां तक ​​कि सबसे नज़दीक मैं अभी तक आया हूं, लेकिन "फ्रंटेंड-src/coffeescript" फ़ोल्डर संरचना को निर्देशिका निर्देशिका से dest निर्देशिका में कॉपी किया जा रहा है।

coffee: { 
    changed: { 
    expand: true, 
    cwd: './', 
    src: ['<%= grunt.regarde.changed %>'], 
    dest: 'public/js/', 
    ext: '.js' 
    } 
}, 
regarde: { 
    coffee: { 
    files: 'frontend-src/coffeescript/**/*.coffee', 
    tasks: ['coffee:changed', 'livereload'] 
    } 
} 

यह सब ग्रंट 0.4.0 के साथ है। किसी भी तरह की सहायता का स्वागत किया जाएगा!

उत्तर

2

मुझे एक ही समस्या है। मैंने इसे regarde:file ईवेंट का उपयोग करके हल किया।

सबसे पहले मैं regarde:file ईवेंट का उपयोग करके बदली गई फ़ाइलों के लिए सुनता हूं। यह कॉन्फ़िगरेशन को दो कार्यों के लिए खिलाएगा: clean:coffee यदि स्रोत स्थान में फ़ाइलें हटा दी गई हैं और coffee:refresh हैं, तो फ़ाइलों को बदल दिया/जोड़ा गया है।

फिर regarde कार्य अपने कार्यों को ट्रिगर करेगा, जो refresh:coffee लॉन्च करेगा (coffee:refresh से गलत नहीं होना चाहिए)। यह कार्य जांच करेगा कि clean:coffee और/या coffee:refresh के लिए कॉन्फ़िगरेशन जोड़ा गया है और यदि आवश्यक हो तो इन कार्यों को चलाएं (फ़ंक्शन grunt.task.run के माध्यम से)। अगर ध्वज को रीसेट भी किया जाएगा, जिससे कॉन्फ़िगरेशन को फिर से साफ करने के लिए अगले regarde:file ईवेंट प्राप्त होगा।

गहराई से विवरण:

सबसे पहले, regarde config:

// watch for changed coffeescript files 
coffee: { 
    files: 'path/to/coffee/**/*.coffee', 
    tasks: ['refresh:coffee', 'livereload'] 
}, 

तब मैं regarde:file घटना है, जहां मैं अपने config में clean:coffee और coffee:refresh फ़ाइल सूचियां अपडेट के लिए सुन।

फ़ीड विन्यास regarde:file घटना पर आधारित:

grunt.event.on('regarde:file', function (status, target, filepath) { 
    if (resetFlag) { 
     // clean file list from previous cycle, so clean clean:coffee and coffee:refresh 
     // file lists 
     ... 

     resetFlag = false; 
    } 
    if (status === 'deleted') { 
     if (filepath) { 
      // calculate filepath's destination and 
      // add it to clean:coffee filelist 
     } 
    } else { 
     if (!grunt.file.isDir(filepath)) { 
      // add filepath to coffee:refresh filelist 
     } 
    } 
} 

यह grunt.config() समारोह के माध्यम से विन्यास को अद्यतन करने के लिए आसान है। coffee:refresh और clean:coffee फ़ीड करने के लिए कोड स्निपेट के नीचे।

config जोड़ना coffee:refresh रहे हैं:

var config = grunt.config('coffee') || {}; 
var value = config.refresh || {}; 
value.files = value.files || []; 
... 
var cwd = path.dirname(filepath), 
    src = path.basename(filepath), 
    dest = cwd.replace('path/to/source', 'path/to/dest'); 
    value.files.push({ 
     expand:true, 
     src:src, 
     dest:dest, 
     cwd:cwd, 
     ext:'.js' 
    }); 
grunt.config('coffee', config); 

config जोड़ना clean:coffee रहे हैं:

var cwd = path.dirname(filepath), 
     src = path.basename(filepath), 
     dest = cwd.replace('path/to/source', 'path/to/dest'); 
     value.src.push(path.join(dest, src.replace('coffee', 'js'))); 
    // clean only what has been removed 
     config = grunt.config('clean') || {}; 

    config.coffee = value; 

    grunt.config('clean', config); 

टास्क refresh:coffee ट्रिगर किया जाता है:

grunt.registerMultiTask('refresh', 'refreshing the changed file(s)', function() { 
     this.requires('regarde'); 

     var tasks = []; 
     var clean = grunt.config('clean'); 

     // check if there is clean:refresh config available 
     if (clean && clean[this.target]) { 
      tasks.push('clean:' + this.target); 
     } 
     var config = grunt.config(this.target); 

     // check if there is coffee:refresh config available 
     if (config && config.refresh) { 
      tasks.push(this.target + ':refresh'); 
     } 
     // run the tasks 
     grunt.task.run(tasks); 

     // set the resetFlag back to true 
     resetFlag = true; 
    }); 
0

grunt.regarde.changed एक सरणी सही है?

src: ['<%= grunt.regarde.changed %>']

src: '<%= grunt.regarde.changed %>'

मैं एक पल के लिए घुरघुराना-योगदान-कॉफी के स्रोत के माध्यम से देखा देखने के लिए अगर इसे सही ढंग से निपटने के नहीं जो कुछ भी आप इसे दे रहे हैं हो सकता है होना चाहिए। ऐसा लगता है कि जिस स्ट्रिंग सरणी को आप इसे दे रहे हैं, वह पकड़ा नहीं जाता है और इसका सामना नहीं किया जाता है।

मुझे लगता है कि अगर आप गलती से हो सकता गुजर रहे हो: src: [ '[path1, path2, path3, etc]' ]

अगर मैं जिस तरह से बंद आधार हूँ, एक टिप्पणी छोड़ और मैं इस जवाब से हटा देंगे।

+1

'src: '<% = grunt.regarde.changed%>' 'मेरे लिए काम किया (स्ट्रिंग में लपेटने की आवश्यकता है)। – Adam

+0

धन्यवाद, मैंने इसे ऊपर बदल दिया। – nackjicholson

3

मैं इस मुद्दे को अपने आप को था और मैं के लिए यह इस मुद्दे पर टिप्पणी से प्रेरित एक समाधान के साथ आने में सक्षम था: https://github.com/gruntjs/grunt-contrib-watch/issues/14

यह घुरघुराना-योगदान-घड़ी प्लगइन के लिए वास्तव में है, लेकिन यह होना चाहिए गड़बड़ी के लिए भी काम करते हैं, क्योंकि इसमें समान घटनाएं होती हैं।

विचार watch ईवेंट कॉलबैक को बाध्य करना है, जिसमें आप बदले गए फ़ाइल के पथ के साथ गड़बड़ी कॉन्फ़िगरेशन में एक नया कार्य जोड़ते हैं, फिर इसे चलाएं।

मेरी Gruntfile.coffee से:

coffee: 
    app: 
     expand: true 
     cwd: 'app/' 
     src: ['*.coffee',"**/*.coffee"] 
     dest: './public/temp' 
     ext: '.js' 
watch: 
    coffee: 
     files: ['app/**/*.coffee'] 
     tasks: ['livereload'] 
     options: 
      nospawn: true 

grunt.event.on 'watch', (action, filepath) ->  
    cwd = 'app/' 
    filepath = filepath.replace(cwd,'') 
    grunt.config.set('coffee', 
     changed: 
      expand: true 
      cwd: cwd 
      src: filepath 
      dest: './public/temp' 
      ext: '.js' 
    ) 
    grunt.task.run('coffee:changed') 

nospawn घड़ी कार्य के लिए महत्वपूर्ण है, इसलिए यह livereload कार्य से पहले नया कार्य चलाता है। मुझे पूरा यकीन है कि डिफ़ॉल्ट रूप से बाल प्रक्रियाओं को जन्म नहीं देता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^