2012-03-21 14 views
12



ben bazı iç JS kodu maruz istediğiniz bir günlük API var kullanımları. Bu API'yi kullanabilmek için sadece bir hata ayıklama oluştururken kullanabilmek istiyorum. Şu anda, kısmen çalışıyorum. Yalnızca hata ayıklama yapılarında günlüğe kaydedilir, ancak düzenli bir yapı olduğunda bu API'ye yapılan çağrılar koddadır. Goog.DEBUG = false ile derleyici olduğumda, kapatma-derleyicisinin esas olarak bu ölü kodları kaldırmasını isterim.olun Kapatma Derleyici şerit günlüğü fonksiyonu

Günlüğü tanımı:

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 bu çalışır Web görünümündeki sağlanan bir Java nesnesidir ve düzgün böyle taburcu: my kodunda,

var AndroidLog = {}; 

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

Sonra ben kullanabilir : o zaman h Bu API sağlayabilir nasıl benim tüm kodu üzerinde bu API kullanmak, ancak:

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

sorum şudur goog.DEBUG = true ile derlenmediğinde kaldırılan bu API'ye yapılan çağrılar var mı? Şu anda, kod tabanım hiçbir zaman çağrılmayan Log API'ye yapılan bir grup çağrıyla şişiriliyor. Kaldırılmasını istiyorum.

Teşekkürler! Bunun yerine jfriend00 olarak kendi Kabuk programı

+0

OK tüm günlük iletilerini şerit olacak, biraz daha kazma sonra, taburcu fonksiyonlar inlined görünmemektedir. http://code.google.com/p/closure-compiler/issues/detail?id = 230 Yine de, goog.DEBUG && –

+0

ile her aramayı hazırlamanın dışında bir geçici çözüm bulmak isterim. Tüm hata ayıklama msg'lerini kendi oluşturma işlemimin bir parçası olarak kaynağımdan çıkarmak için Python'da küçük bir komut dosyası yazdım. İhtiyacım olduğunda bir şey bulabilirdim. Garip çünkü böyle yaygın bir ihtiyaç olmalı. – jfriend00

+0

Evet, o rotaya gidebilirim :) –

cevap

0

Tamam, com.foo.Log() yöntemini ve yöntemlerini dışa aktarmayı bırakırsam bunun yapılması çok kolay. Gerçekten bazı özel durumlarda log, ama yine de benim iç kodunda günlük aramaları çıkarılmasını isteyip muktedir istiyorum, bunun için sadece iki sınıfları ilan edebilir:

// 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

Ben varsayılan olarak DERLENEN (goog.DEBUG yanı geliyor ise) derleyici tanımlamak API, sahip DEBUG, bakmak istiyorum önerdi, ama orada yapabilirsiniz kendininkini yuvarla.

+1

Bu noktayı özlüyor. Buradaki nokta, hata ayıklama çıktısını (bu kolay) kapatmak değildir. Asıl nokta, dağıtımdan önce tüm hata ayıklama kodlarının kaldırılmasıdır, bu nedenle fazladan yer kaplamamak, yürütmek ve hatta dünyaya gösterilmek. – jfriend00

+0

lennel, öneri için teşekkürler. Jfriend00 bahsettiği gibi, bu sadece veriyi iletmeme izin verecek. Ben zaten goog.DEBUG parametresi üzerinden geçirilen verileri kullanıyorum ve bir fonksiyonun gövdesini mükemmel bir şekilde sıyırma. Ancak bu boş işlev gövdesi, işlev kullanımlarını kaldırmak için koduma hiçbir zaman girilmez. Bunun nedeni, CC'nin externed işlevlerin çalışma zamanında değiştirilmeyeceğini varsaymasıdır. –

+0

üzgünüm, tatilde uzaklarda. Yanlış olarak ayarlanmış bir tanım değişkeni ile derlerseniz, derleyici bu kodu gelişmiş modda geçersiz kılar. – lennel

1

Kapatma Derleyici CompilerOptions.java dört seçenek sunar kod soymak için: 1) stripTypes, 2) stripNameSuffixes, 3) stripNamePrefixes ve 4) stripTypePrefixes. Kapanış oluşturma aracı plovr, JSON configuration file optionsname-suffixes-to-strip ve type-prefixes-to-strip aracılığıyla stripNameSuffixes ve stripTypePrefixes'u gösterir.

bu seçenekler Kapatma nasıl çalıştığına ilişkin mükemmel örnekleri vardır: 444. Aşağıdaki satırlar için 442 ortak kullanım durumları olarak verilmektedir sayfalarda Kesin Kılavuzu:

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

bu nüansları anlamak için seçenekleri ve olası tuzakları önlemek için, Kapanış: Tam Kılavuzu.

+0

Teşekkürler! Closure Ant Görevini kullandığımı ve bu nedenle derleyici seçeneklerini doğrudan iletme yeteneğim olmadığından bahsetmeliyim. Kendi derleyici seçeneklerimi geçmek için karınca görevini alt sınıflandırma yapmayı düşünüyordum, ama aslında bunu yapmanın bir yolu olup olmadığını sormak istedim. Ben de plovr'a bir göz atacağım. –

+0

@SkyKelsey: Yukarıdaki kod derleme için derleyici seçenekleri, CompilerOptions.java adlı Closure Compiler Java kaynağının iç kısmıdır. Ancak, plovr, Java kodu yazmadan stripNameSuffixes ve stripTypePrefixes kullanımını kolaylaştırır. Şu anda ek esneklik sağlayacak tüm Kapanış Araçları için bir Ant görevler paketi yazıyorum. Umarım, Nisan 2012'nin sonundan önce piyasaya sürülmeye hazır olurlar. –