11

कॉफ़ीस्क्रिप्ट का उपयोग करके मुझे अपनी .js फ़ाइलों को अद्यतन करने के लिए किसी भी प्रकार की बिल्ड स्क्रिप्ट के माध्यम से जाना होगा, और मेरे पास उनमें से दो हैं, एक डिबगिंग के लिए और एक उत्पादन के लिए (एक को कम करने के लिए उग्लिफ़ का उपयोग करता है फाइलें, कोई नहीं करता)। तो मैं सोच रहा था कि कुछ सशर्त संकलन भी सुविधाजनक होगा, कोड के साथ जो केवल डीबग बिल्ड में प्रवेश करता है।कॉफीस्क्रिप्ट/UglifyJS में सशर्त संकलन

इसे प्राप्त करने का सबसे आसान तरीका क्या है, आदर्श रूप से एक साधारण कमांड लाइन स्विच द्वारा नियंत्रित किया जाता है जिसे मैं कॉफी या उलझाने के लिए दे सकता हूं?

उत्तर

7

आप एक निर्माण स्क्रिप्ट वैसे भी लिख रहे हैं, तो आप इसे करने के लिए एक पूर्वप्रक्रमक कदम जोड़ सकते हैं:

यहाँ Cakefile के संबंधित भाग है। चूंकि कॉफीस्क्रिप्ट टिप्पणियों को दर्शाने के लिए # का उपयोग करता है, इसलिए सी प्रीप्रोसेसर एक अच्छी पसंद की तरह दिखता है। तब

some code... 
#ifdef DEBUG 
debug code... 
#endif 

, आप cpp -E -Xpreprocessor -DDEBUG <filename> -o <outfile> साथ डिबग संस्करण preprocess कर सकते हैं और CoffeeScript साथ <outfile> संकलन: आप #ifdef रों साथ डिबग कोड निरूपित कर सकते हैं। इसी तरह, cpp -E <filename> -o <outfile> के साथ उत्पादन संस्करण preprocess।

संपादित करें: यह कठिन है, क्योंकि इसका मतलब है कि किसी भी कॉफीस्क्रिप्ट टिप्पणियां जो इंडेंट नहीं हैं, प्रीप्रोकैसिंग चरण को तोड़ देंगी। सुनिश्चित नहीं है कि यह आपके लिए कितनी समस्या है। उदाहरण के लिए,

code... 
#comment about the code 

निर्माण टूट जाएगा, लेकिन

code... 
    indented code... 
    #indented comment 

तरीके से कार्य करेंगे, क्योंकि पूर्वप्रक्रमक लाइनों पर गौर नहीं करता जब तक कि उनकी पहली चरित्र एक # है।

+1

मुझे यह विचार पसंद है, हालांकि आपको सावधान रहना होगा कि #if blah, #error blah, या कुछ और जो प्रीप्रोसेसर निर्देशों के साथ संघर्ष करेंगे, शामिल न करें। – obmarg

+0

@obmarg अच्छा बिंदु। मैं इसका ध्यान रखूंगा। संपादित करें: कोई भी टिप्पणी जो इंडेंट नहीं है, वह समस्या होगी क्योंकि प्रीप्रोसेसर चकित होगा; इंडेंट टिप्पणियों की उम्मीद के रूप में अनदेखा किया जाएगा। –

+0

+1। इससे काम बन जाएगा। मुझे प्री-प्रोसेसर टिप्पणियों को इंडेंट करने की आवश्यकता नहीं है। लेकिन क्या आप एक cpp- जैसे टूल के बारे में जानते हैं जो node.js पर चलता है (इसके लिए अतिरिक्त कुछ भी इंस्टॉल नहीं करना चाहते हैं, एनपीएम के माध्यम से छोड़कर, जो आसान है)? – Thilo

2

ऐसा लगता है जैसे आप कह रहे हैं कि आपके पास दो बिल्ड स्क्रिप्ट हैं? string.js के लिए, मैं जो भी आपको लगता हूं उसे प्राप्त करने के लिए मैं केवल एक केकफाइल का उपयोग करता हूं। अनिवार्य रूप से, यदि स्रोत फ़ाइल बदलती है, तो यह एक नियमित जेएस फ़ाइल और फिर एक यूग्लीफाइड फ़ाइल उत्पन्न करती है।

task 'watch', 'Watch src/ for changes', -> 
    browserTestFile = path.join(process.cwd(), 'test_browser', 'string.test.js') 

    coffee = spawn 'coffee', ['-w', '-c', '-o', 'lib', 'src'] 
    coffee.stderr.on 'data', (data) -> 'ERR: ' + process.stderr.write data.toString() 
    coffee.stdout.on 'data', (data) -> 
     d = data.toString() 
     if d.indexOf('compiled') > 0 
     #invoke 'test' 

     fsw = fs.createWriteStream(browserTestFile, flags: 'w', encoding: 'utf8', mode: 0666) 
     coffee_test = spawn 'coffee', ['-c', '-p', 'test/string.test.coffee'] 
     coffee_test.stdout.pipe(fsw, end: false) 

     uglify = spawn 'uglifyjs', ['lib/string.js'] 
     uglify.stdout.pipe(fs.createWriteStream('lib/string.min.js')) 

     else 
     growl(d, title: 'Error', image: './resources/error.png') 

     process.stdout.write data.toString() 
+0

हां, वह हिस्सा पहले से ही ठीक काम करता है। लेकिन मैं यह भी चाहता हूं कि यूग्लीफाइड फाइल की सामग्री दूसरे की तुलना में थोड़ा अलग हो। #ifdef 'DEBUG' सोचो। वही स्रोत फ़ाइल, लेकिन बाहरी स्विच के साथ जो हटाया जाता है उसे प्रभावित करता है। – Thilo

1

सी प्रीप्रोसेसर का एक विकल्प M4 मैक्रो प्रोसेसर (Wikipedia intro) होगा। मैंने इसे स्वयं नहीं उपयोग किया है, इसलिए मैं इसकी समीक्षा नहीं कर सकता और मुझे पता है कि यह दर्द का कुछ हद तक होना चाहिए लेकिन यह आपकी समस्या का समाधान करेगा। इसके अलावा, सी प्रीप्रोसेसर की तरह, हर ओएस पर कल्पना की जा सकती है।

0

मैं इस तरह की चीज़ के लिए https://github.com/jsoverson/grunt-preprocess का उपयोग करता हूं। यह ठीक है कि मैं क्या करने की कोशिश कर रहा हूं:

detect_ennemy_collision: (ennemies) -> 

# @ifdef DEBUG 
    expect(ennemies).to.be.an 'array' 
    expect(ennemies.length).to.be.ok 

    for ennemy in ennemies 
     (expect ennemy).to.be.an.instanceof Character 

# @endif 
#...