2013-03-26 13 views
6

में बिल्ड आउटपुट पथ सेट करने के लिए ग्लोबल वेरिएबल का उपयोग करें मेरे पास कुछ गड़बड़ कार्य हैं और मैं उन कार्यों में वैश्विक चर साझा करने की कोशिश कर रहा हूं और मैं मुद्दों पर चल रहा हूं।ग्रंट

मैंने कुछ कस्टम कार्य लिखे हैं जो निर्माण प्रकार के आधार पर उचित आउटपुट पथ निर्धारित करते हैं। ऐसा लगता है कि चीजों को सही ढंग से सेट करना है।

// Set Mode (local or build) 
grunt.registerTask("setBuildType", "Set the build type. Either build or local", function (val) { 
    // grunt.log.writeln(val + " :setBuildType val"); 
    global.buildType = val; 
}); 

// SetOutput location 
grunt.registerTask("setOutput", "Set the output folder for the build.", function() { 
    if (global.buildType === "tfs") { 
    global.outputPath = MACHINE_PATH; 
    } 
    if (global.buildType === "local") { 
    global.outputPath = LOCAL_PATH; 
    } 
    if (global.buildType === "release") { 
    global.outputPath = RELEASE_PATH; 
    } 
    if (grunt.option("target")) { 
    global.outputPath = grunt.option("target"); 
    } 
    grunt.log.writeln("Output folder: " + global.outputPath); 
}); 

grunt.registerTask("globalReadout", function() { 
    grunt.log.writeln(global.outputPath); 
}); 

तो, मैं बाद में कार्य में वैश्विक.outputPath का संदर्भ देने और त्रुटियों में चलने का प्रयास कर रहा हूं।

यदि मैं कमांड लाइन से grunt test पर कॉल करता हूं, तो यह सही पथ को कोई समस्या नहीं देता है।

हालांकि, मैं अगर इस तरह एक कार्य: साफ: { रिहाई: { src: global.outputPath } }

यह निम्न त्रुटि फेंकता है: Warning: Cannot call method 'indexOf' of undefined Use --force to continue.

इसके अलावा, setOutput कार्य में मेरे स्थिरांक मेरे Gruntfile.js

किसी भी विचार के शीर्ष पर सेट हैं? क्या मुझसे यहां कुछ गलत हो रहा है?

+0

मुझे लगता है कि यह वैश्विक.outputPath से संबंधित हो सकता है grunt.initConfig ({}) के बाहर सेट किया जा रहा है, जबकि, मैं grunt.initConfig के अंदर चर का उपयोग करने की कोशिश कर रहा हूं ({}) – ThePuzzleMaster

उत्तर

13

तो, मैं सही रास्ते पर था। मुद्दा यह है कि उन वैश्विक चर से पहले मॉड्यूल निर्यात सेट हो जाते हैं, इसलिए वे initConfig() कार्य के भीतर परिभाषित बाद के कार्यों में सभी अनिर्धारित हैं।

जिस समाधान के साथ मैं आया, हालांकि, बेहतर हो सकता है, एक grunt.option मान को ओवरराइट करना है।

clean: { 
    build: { 
    src: ["<%= grunt.option(\"target\") %>"] 
    } 
} 
:

grunt.registerTask("setOutput", "Set the output folder for the build.", function() { 
    if (global.buildType === "tfs") { 
    global.outputPath = MACHINE_PATH; 
    } 
    if (global.buildType === "local") { 
    global.outputPath = LOCAL_PATH; 
    } 
    if (global.buildType === "release") { 
    global.outputPath = RELEASE_PATH; 
    } 
    if (grunt.option("target")) { 
    global.outputPath = grunt.option("target"); 
    } 

    grunt.option("target", global.outputPath); 
    grunt.log.writeln("Output path: " + grunt.option("target")); 
}); 

और कार्य initConfig() में परिभाषित इस तरह देखा:

मैं --target

काम कर समाधान इस तरह दिखता है मेरी कार्य के लिए एक वैकल्पिक विकल्प होता है

यदि आपके पास बेहतर समाधान है तो इसमें झुकने के लिए स्वतंत्र महसूस करें। अन्यथा, शायद यह किसी और की मदद कर सकता है।

+1

मुझे वैश्विक स्तर पर निर्माण की लक्ष्य निर्देशिका सेट करने का विचार पसंद है। विकल्प प्रत्येक प्रक्रिया के लिए अलग-अलग नियमों को परिभाषित कर रहा है क्योंकि गंतव्य अलग है। (उदाहरण: 'एसएएस: देव ',' कॉफी: देव ',' एसएएस: डिस्ट',' कॉफी: डिस्ट')। यह दर्द है और बहुत शुष्क नहीं है। इस पर पैर काम करने के लिए धन्यवाद! – SimplGy

+0

मैं उस बिट से उलझन में हूं जहां आप 'grunt.option ('target') के बराबर' global.Outputpath' सेट कर रहे हैं, यदि यह परिभाषित किया गया है, तो 'grunt.option ('target') 'के मान पर सेट करें 'global.Outputpath'। आपका इरादा क्या है? – SimplGy

+0

अहह। अब इसे देखकर, बेहतर तरीका उस समारोह की पहली पंक्ति पर वापसी करना होगा यदि विकल्प ("लक्ष्य") रन टाइम पर सेट किया गया था। अन्यथा, मैं ग्लोबल सेट कर रहा हूं। Grut.option ("target") पर आउटपुटपैथ ताकि अगर वे रन टाइम पर लक्ष्य में गुजरते हैं, तो यह सभी डिफ़ॉल्ट ओवरराइड करता है। – ThePuzzleMaster

4

मेरे पास ऐसा करने का एक तरीका है जो आपको --dev जैसे मानों का उपयोग करके आउटपुट पथ निर्दिष्ट करने की अनुमति देता है। अब तक यह बहुत अच्छा काम कर रहा है, मुझे यह पसंद है। सोचा था कि मैं इसे साझा करूंगा, क्योंकि किसी और को भी यह पसंद हो सकता है।

grunt cssmin --dist #sent to dist target 
grunt cssmin --dev #sent to dev target 
grunt cssmin --dev #sent to default target (dev) 
+2

आपकी Gruntfile ताबूत है? सेटअप करने के लिए लिंक/कैसे कृपया :) अच्छा टिप बीटीडब्ल्यू – oligofren

0

यह एक पुराना सवाल है, मैं बस अपना 5 सेंट में फेंक माना जाता है:

# Enum for target switching behavior 
    TARGETS = 
     dev: 'dev' 
     dist: 'dist' 

    # Configurable paths and globs 
    buildConfig = 
     dist: "dist" 
     dev: '.devServer' 
     timestamp: grunt.template.today('mm-dd_HHMM') 

    grunt.initConfig 
     cfg: buildConfig 
     cssmin: 
      crunch: 
       options: report: 'min' 
       files: "<%= grunt.option('target') %>/all-min.css": "/**/*.css" 

    # Set the output path for built files. 
    # Most tasks will key off this so it is a prerequisite 
    setPath = -> 
     if grunt.option 'dev' 
     grunt.option 'target', buildConfig.dev 
     else if grunt.option 'dist' 
     grunt.option 'target', "#{buildConfig.dist}/#{buildConfig.timestamp}" 
     else # Default path 
     grunt.option 'target', buildConfig.dev 
     grunt.log.writeln "Output path set to: `#{grunt.option 'target'}`" 
     grunt.log.writeln "Possible targets:" 
     grunt.log.writeln target for target of TARGETS 

    setPath() 
इस स्थापना के साथ

, आप की तरह कमांड चलाने कर सकते हैं।

आप config चर की जरूरत है किसी भी काम से सुलभ हो, बस इस तरह अपने मुख्य में परिभाषित (एक है कि आप हमेशा लोड होगा) कॉन्फ़िग फ़ाइल:

module.exports = function(grunt) 
{ 
    // 
    // Common project configuration 
    // 
    var config = 
    { 
     pkg: grunt.file.readJSON('package.json'), 

     options: // for 'project' 
     { 
      dist: 
      { 
       outputPath: '<%= process.cwd() %>/lib', 
      }, 
      dev: 
      { 
       outputPath: '<%= process.cwd() %>/build', 
      }, 
     }, 
    } 

    grunt.config.merge(config) 
} 

तो फिर तुम बस मूल्य तक पहुँच सकते हैं इस तरह:

  • कॉन्फ़िग फ़ाइल (ओं) में

... my_thingie: [ ends_up_here: '<%= options.dev.outputPath %>/bundle', ], ...

    कार्यों में

// as raw value grunt.config.data.options.dist.outputPath // after (eventual) templates have been processed grunt.config('options.dist.outputPath')

मैं कुंजी options यहां इस्तेमाल सिर्फ सम्मेलन के साथ लाइन में होना करने के लिए है, लेकिन आप जब तक आप एक काम 'options' नामित या रजिस्टर करने के लिए नहीं याद के रूप में कुछ भी उपयोग कर सकते हैं जो भी आपने कुंजी के लिए उपयोग किया था :)

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