2012-03-21 14 views
12



मेरे पास एक लॉगिंग एपीआई है जो मैं कुछ आंतरिक जेएस कोड को बेनकाब करना चाहता हूं। मैं लॉग इन करने के लिए इस एपीआई का उपयोग करने में सक्षम होना चाहता हूं, लेकिन केवल तभी जब मैं डीबग बिल्ड कर रहा हूं। अभी, मैं इसे आंशिक रूप से काम कर रहा हूँ। यह केवल डीबग बिल्ड पर लॉग ऑन करता है, लेकिन नियमित रूप से निर्माण होने पर इस एपीआई के कॉल अभी भी कोड में हैं। जब मैं goog.DEBUG = false के साथ संकलक करता हूं तो मैं इस अनिवार्य रूप से मृत कोड को हटाने के लिए क्लोजर-कंपाइलर चाहता हूं।क्लोजर कंपाइलर स्ट्रिप लॉग फ़ंक्शन उपयोग करें

लॉग परिभाषा:

goog.provide('com.foo.android.Log'); 
com.foo.Log.e = function(message){ 
    goog.DEBUG && AndroidLog.e(message); 
} 
goog.export(com.foo.Log, "e", com.foo.Log.e); 

AndroidLog वेबव्यू इस में चला जाएगा के लिए प्रदान की एक जावा वस्तु है, और ठीक से इस तरह externed:

var AndroidLog = {}; 

/** 
* Log out to the error console 
* 
* @param {string} message The message to log 
*/ 
AndroidLog.e = function(message) {}; 

फिर, मेरे कोड में, मैं उपयोग कर सकते हैं :

com.foo.Log.e("Hello!"); // I want these stripped in production builds 

मेरा प्रश्न यह है: मैं इस एपीआई को कैसे प्रदान कर सकता हूं, इस एपीआई का उपयोग अपने सभी कोड पर करें, लेकिन फिर एच जब आप goog.DEBUG = true के साथ संकलित नहीं करते हैं तो इस एपीआई को किसी भी कॉल को हटा दिया जाता है? अभी, मेरा कोड बेस लॉग एपीआई को कॉल के गुच्छा के साथ फूला हुआ है जिसे कभी नहीं कहा जाता है। मैं हटा देना चाहता हूँ।

धन्यवाद!

+0

ठीक है, कुछ और खुदाई के बाद, ऐसा लगता है कि externed कार्यों inlined नहीं कर रहे हैं। http://code.google.com/p/closure-compiler/issues/detail?आईडी = 230 मैं अभी भी goog.DEBUG और –

+0

के साथ प्रत्येक कॉल को प्रीपेड करने के अलावा एक कामकाज ढूंढना चाहूंगा। मैंने अपनी बिल्ड प्रक्रिया के हिस्से के रूप में स्रोत से बाहर अपने सभी डीबग संदेश को पट्टी करने के लिए पाइथन में एक छोटी लिपि लिखी थी। जब मुझे इसकी ज़रूरत होती तो मुझे कुछ मिल सकता था। यह अजीब है क्योंकि यह एक आम आवश्यकता होनी चाहिए। – jfriend00

+0

हाँ, मैं उस मार्ग पर जा सकता हूं :) –

उत्तर

0

ठीक है, यह पता चला है कि अगर मैं com.foo.Log() और इसकी विधियों को निर्यात करना बंद करता हूं तो यह करना आसान है। मैं वास्तव में कुछ विशिष्ट मामलों में प्रवेश करते है, लेकिन अभी भी अपने आंतरिक कोड में लॉग कॉल को निकाल देते हैं करने में सक्षम होना चाहते हैं, तो मैं सिर्फ इस बात के लिए दो वर्गों की घोषणा कर सकते हैं:

// This will get inlined and stripped, since its not exported. 
goog.provide('com.foo.android.Log'); 
com.foo.Log.e = function(message){ 
    goog.DEBUG && AndroidLog.e(message); 
} 
// Don't export. 


// This be available to use after closure compiler runs, since it's exported. 
goog.provide('com.foo.android.production.Log'); 
goog.exportSymbol("ProductionLog", com.foo.android.production.Log); 
com.foo.android.production.Log.log = function(message){ 
    goog.DEBUG && AndroidLog.e(message); 
} 
// Export. 
goog.exportProperty(com.foo.android.production.Log, "log", com.foo.android.production.Log.log); 
0
इसके बजाय jfriend00 के रूप में अपनी खुद की स्क्रिप्ट चलाने के

सुझाव दिया मैं संकलक के एपीआई को परिभाषित (जहाँ goog.DEBUG रूप में अच्छी तरह से आता है), आपके पास डीबग, डिफ़ॉल्ट द्वारा संकलित पर विचार करेंगे, लेकिन वहाँ आप कर सकते हैं अपना खुद का रोल करो।

+1

यह बिंदु याद करता है। बिंदु सिर्फ डीबग आउटपुट को बंद नहीं करना है (यह आसान है)। बिंदु परिनियोजन से पहले सभी डीबग कोड को हटाना है, इसलिए यह अतिरिक्त जगह नहीं ले रहा है, निष्पादित या यहां तक ​​कि दुनिया को दिखाया जा रहा है। – jfriend00

+0

लेनेल, सुझाव के लिए धन्यवाद। जैसा कि jfriend00 ने उल्लेख किया है, यह मुझे डेटा को पास करने की अनुमति देगा। मैं पहले से ही goog.DEBUG पैरामीटर के माध्यम से पारित डेटा का उपयोग कर रहा हूं, और यह पूरी तरह से फ़ंक्शन के शरीर को अलग कर रहा है। लेकिन फ़ंक्शन उपयोग को हटाने के लिए उस खाली फ़ंक्शन बॉडी को मेरे कोड में कभी भी रेखांकित नहीं किया गया है। मुझे लगता है कि ऐसा इसलिए है क्योंकि सीसी यह नहीं मान सकती कि बाहरी कार्यों को रन-टाइम में संशोधित नहीं किया जाएगा? –

+0

क्षमा करें, छुट्टी पर चले गए। यदि आप परिभाषित चर सेट को संकलित करते हैं, तो संकलक उन्नत मोड में उस कोड को छोड़ देगा। – lennel

1

बंद संकलक CompilerOptions.java में चार विकल्प प्रदान करता है कोड को पट्टी करने के लिए: 1) stripTypes, 2) stripNameSuffixes, 3) stripNamePrefixes और 4) stripTypePrefixes। क्लोजर बिल्ड टूल प्लोव, stripNameSuffixes और stripTypePrefixes अपने JSON configuration file optionsname-suffixes-to-strip और type-prefixes-to-strip के माध्यम से खुलासा करता है।

वहाँ कैसे इन विकल्पों बंद में काम के उत्कृष्ट उदाहरण हैं: पृष्ठों पर निश्चित गाइड 444. निम्नलिखित लाइनों के लिए 442 सामान्य उपयोग के मामलों के रूप में प्रदान की जाती हैं:

options.stripTypePrefixes = ImmutableSet.of(“goog.debug”, “goog.asserts”); 
options.stripNameSuffixes = ImmutableSet.of(“logger”, “logger_”); 

इन की बारीकियों को समझने के लिए विकल्प और संभावित नुकसान से बचें, मैं अत्यधिक में पूर्ण उदाहरण पढ़ने की सलाह देता हूं: परिभाषा गाइड

+0

धन्यवाद! मुझे जिक्र करना चाहिए कि मैं क्लोजर चींटी टास्क का उपयोग कर रहा हूं, और इसलिए इसमें सीधे कंपाइलर विकल्प पास करने की क्षमता नहीं है। मैं अपने स्वयं के कंपाइलर विकल्पों में प्रवेश करने के लिए चींटी कार्य को उपclassing पर विचार कर रहा था, लेकिन वास्तव में पूछना चाहता था कि वास्तव में ऐसा करने का कोई तरीका था। मैं प्लोवर पर भी एक नज़र डालेगा। –

+0

@ स्कीकेल्सी: कोड को स्ट्रिप करने के लिए ऊपर वर्णित कंपाइलर विकल्प क्लोजर कंपाइलर जावा स्रोत, अर्थात् कंपाइलरऑप्शन.जावा के लिए आंतरिक हैं। हालांकि, plovr जावा कोड लिखने के बिना स्ट्रिपनाम स्फिक्स और स्ट्रिप टाइपइपिक्स का उपयोग करना आसान बनाता है। मैं वर्तमान में सभी क्लोजर टूल्स के लिए चींट कार्यों का एक सूट लिख रहा हूं जो अतिरिक्त लचीलापन प्रदान करेगा। उम्मीद है कि वे अप्रैल 2012 के अंत से पहले रिलीज के लिए तैयार होंगे। –

0

मैंने एक कंपाइलर को संशोधित किया है और इसे एनपीएम पैकेज के रूप में पैक किया है।

आप इसे यहाँ प्राप्त कर सकते हैं: https://github.com/thanpolas/superstartup-closure-compiler#readme

यह संकलन के दौरान सभी प्रवेश करने गए संदेशों हटेगा

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