2013-05-14 7 views
9

अब मेरे पास grunt.initConfig() चलाने से पहले मुझे पता होना चाहिए कि फ़ाइल नामों और पथों को गतिशील रूप से समझने के लिए रॉडर में कुछ PHP स्रोतों को पार्स करने के लिए स्रोतफाइल को पार्स करने के लिए कुछ स्वचालित पहचान जादू करने के लिए मेरा ग्रंटफाइल सेटअप है।grunt.initConfig() से पहले मैं एसिंक्रोनस ऑपरेशन कैसे कर सकता हूं?

दुर्भाग्य से grunt.initConfig() असीमित रूप से चलाने के लिए प्रतीत नहीं होता है, इसलिए मुझे इसे कॉल करने से पहले मेरे एसिंक्रोनस कोड को निष्पादित करने का कोई तरीका नहीं दिखता है। क्या इसे पूरा करने के लिए कोई चाल है या क्या मुझे अपने पहचान दिनचर्या को समकालिक रूप से फिर से लिखना है? क्या मेरे कॉलबैक आने से पहले निष्पादन को अवरुद्ध करने का कोई आसान तरीका है?

ग्रेट कार्यों के अंदर निश्चित रूप से this.async() है, लेकिन initConfig() के लिए यह काम नहीं करता है।

function findSomeFilesAndPaths(callback) { 
    // async tasks that detect and parse 
    // and execute callback(results) when done 
} 

module.exports = function (grunt) { 
    var config = { 
    pkg: grunt.file.readJSON('package.json'), 
    } 

    findSomeFilesAndPaths(function (results) { 
    config.watch = { 
     coffee: { 
     files: results.coffeeDir + "**/*.coffee", 
     tasks: ["coffee"] 
     // ... 
     } 
    }; 

    grunt.initConfig(config); 

    grunt.loadNpmTasks "grunt-contrib-coffee" 
    // grunt.loadNpmTasks(...); 
    }); 
}; 

किसी भी अच्छे विचार कैसे इस किया जाना:

यहाँ एक नीचे छीन उदाहरण है?

बहुत बहुत धन्यवाद!

+0

अगर आप सिर्फ async समारोह के कॉलबैक में grunt.initconfig और grunt.loadnpmtasks आदि डाल क्या होता है? –

+0

क्या मैंने ऊपर नहीं किया है? क्या होता है कि गड़बड़ी मेरे कॉलबैक की प्रतीक्षा नहीं करती है, इसलिए 'grunt.initConfig() 'आदि को गड़बड़ ग्राहक रिटर्न से पहले नहीं बुलाया जाएगा। – leyyinad

+0

ओह हाँ आपने किया, मेरी गलती ... –

उत्तर

2

पुनर्लेखन, समकालिक शैली द्वारा हल किया गया। ShellJS काम में आया, विशेष रूप से शेल कमांड को सिंक्रनाइज़ करने के लिए।

5

मैं इसे एक कार्य के रूप में करूँगा क्योंकि ग्रंट सिंक है या यदि आप findSomeFilesAndPaths सिंक कर सकते हैं।

grunt.initConfig({ 
    initData: {}, 
    watch: { 
    coffee: { 
     files: ['<%= initData.coffeeDir %>/**/*.coffee'], 
     tasks: ['coffee'], 
    }, 
    }, 
}); 

grunt.registerTask('init', function() { 
    var done = this.async(); 
    findSomeFilesAndPaths(function(results) { 
    // Set our initData in our config 
    grunt.config(['initData'], results); 
    done(); 
    }); 
}); 

// This is optional but if you want it to 
// always run the init task first do this 
grunt.renameTask('watch', 'actualWatch'); 
grunt.registerTask('watch', ['init', 'actualWatch']); 
+0

आपको बहुत धन्यवाद काइल, आपका समाधान उस न्यूनतम उदाहरण के लिए बहुत उपयोगी है। असल में मेरे पास स्क्रिप्ट्स और स्टाइलशीट्स और कई अन्य कार्यों के लिए कई निर्देशिकाएं हो सकती हैं जो केवल रनटाइम पर जानी जाएंगी, जैसे स्वचालित डाउनलोड और डिकंप्रेशन (यह सब रेक के साथ ठीक काम करता है, लेकिन कई कारणों से मैं गड़बड़ी करना चाहता हूं) । मुझे यह इस तरह से काम करने के लिए मिल सकता है, लेकिन 'grunt.initConfig() 'को कॉल करने से पहले पूरी कॉन्फ़िगरेशन ऑब्जेक्ट तैयार करना बहुत आसान और क्लीनर होगा। क्या यह पूरा किया जा सकता है? – leyyinad

+0

चूंकि ग्रंट सिंक हो गया है, दुर्भाग्यवश दुर्भाग्यवश आपकी खुद की गड़बड़ी के बिना नहीं लिख सकते हैं; जो उपरोक्त समाधान, इमो से अधिक बोझिल होगा। –

+0

मुझे लगता है कि आप सही हैं। गिटहब पर, अभी भी एक [मुद्दा] (https://github.com/gruntjs/grunt/issues/783) खोला गया है। – leyyinad

1

कैसे आप ग्रंट में ShellJS इस्तेमाल कर सकते हैं का उदाहरण:

grunt.initConfig({ 
    paths: { 
     bootstrap: exec('bundle show bootstrap-sass').output.replace(/(\r\n|\n|\r)/gm, '') 
    }, 
    uglify: { 
     vendor: { 
      files: { 'vendor.js': ['<%= paths.bootstrap %>/vendor/assets/javascripts/bootstrap/alert.js'] 
     } 
    } 
}); 
संबंधित मुद्दे