2012-03-21 20 views
12



Mam interfejs logowania, który chcę udostępnić niektórym wewnętrznym kodom JS. Chcę móc korzystać z tego interfejsu API do rejestrowania, ale tylko wtedy, gdy robię kompilację debugowania. W tej chwili mam to częściowo działa. Loguje się tylko na kompilacjach debugowania, ale wywołania tego interfejsu API wciąż znajdują się w kodzie, gdy istnieje regularna kompilacja. Chciałbym, aby kompilator zamykający usunął ten zasadniczo martwy kod, gdy kompilator z goog.DEBUG = false.Wykonaj funkcję rejestru taśmowego kompilatora zamknięcia zastosowań

definicja Log:

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 jest obiektem Java dostarczone WebView to będzie działać w, a właściwie externed tak:

var AndroidLog = {}; 

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

Następnie w moim kodu, można użyć :

Moje pytanie brzmi: jak mogę zapewnić ten interfejs API, użyj tego API na całym moim kodzie, ale potem h ave wszelkie połączenia z tym API usunięte, gdy nie zostały skompilowane z goog.DEBUG = prawda? W tej chwili moja baza kodu jest nadęta dzięki kilku połączeniom do Log API, które nigdy nie są wywoływane. Chcę usunąć.

Dzięki!

+0

OK, po jakimś dalszego kopania, wydaje się, że funkcje externed nie są wstawiane. http://code.google.com/p/closure-compiler/issues/detail?id = 230 Nadal chciałbym znaleźć obejście inne niż poprzedzanie każdego połączenia z goog.DEBUG && –

+0

Sam napisałem mały skrypt w Pythonie, aby usunąć wszystkie moje błędy debugowania ze źródła w ramach mojego procesu kompilacji. Mógłbym coś znaleźć, kiedy tego potrzebowałem. To dziwne, ponieważ powinna być taka powszechna potrzeba. – jfriend00

+0

Tak, mogę iść tą drogą :) –

Odpowiedz

0

OK, okazuje się, że jest to łatwe, jeśli przestanę eksportować com.foo.Log() i jego metody. Jeśli naprawdę chcesz być w stanie zalogować się w pewnych szczególnych przypadkach, ale nadal strip połączenia dziennika w kodzie wewnętrznym, mogę po prostu zadeklarować dwie klasy dla tego:

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

Zamiast prowadzenia własnego skryptu jako jfriend00 zasugerował bym spojrzeć na api określenia kompilatora (czyli tam, gdzie goog.DEBUG pochodzi również), masz Debug kompilowane domyślnie, ale można Skręć swój własny.

+1

Tęsknota za sednem. Nie chodzi tylko o wyłączenie wyjścia debugowania (to proste). Chodzi o to, aby przed wdrożeniem usunąć cały kod debugowania, aby nie zabierał on więcej miejsca, nie wykonał, a nawet nie został pokazany światu. – jfriend00

+0

lennel, dzięki za sugestię. Jak wspomniałem jfriend00, to po prostu pozwoli mi przekazywać dane. Używam już danych przekazywanych za pomocą parametru goog.DEBUG, a to całkowicie oczyszcza ciało z funkcji. Ale ta pusta funkcja nie jest nigdy wpisana w mój kod, aby usunąć użyteczność funkcji. Myślę, że to dlatego, że CC nie może założyć, że funkcje zewnętrzne nie zostaną zmodyfikowane w czasie wykonywania? –

+0

Przepraszam, byłem na wakacjach. Jeśli kompilujesz ze zmienną define ustawioną na false, kompilator pominie ten kod w trybie zaawansowanym. – lennel

1

Zamknięcie Compiler oferuje cztery opcje w CompilerOptions.java z kodem kreskowym: 1) stripTypes, 2) stripNameSuffixes, 3) stripNamePrefixes i 4) stripTypePrefixes. Narzędzie Zamknięcie build plovr, naraża stripNameSuffixes i stripTypePrefixes poprzez JSON configuration file optionsname-suffixes-to-strip i type-prefixes-to-strip.

Są doskonałe przykłady, jak te opcje działają w Zamknięcie: The Definitive Guide na stronach 442 do 444. Następujące linie są dostarczane jako typowych przypadków użycia:

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

Aby zrozumieć niuanse tych Opcje i uniknąć potencjalnych pułapek, bardzo polecam przeczytanie pełnych przykładów w Zamknięcie: The Definitive Guide.

+0

Dzięki! Powinienem wspomnieć, że używam zadania Anta zamknięcia, więc nie mam możliwości bezpośredniego przekazywania opcji kompilatora. Zastanawiałem się nad podklasowaniem zadania ant, aby przekazać moje własne opcje kompilatora, ale chciałem zapytać najpierw, czy w rzeczywistości był sposób na zrobienie tego. Przyjrzę się również plovr. –

+0

@SkyKelsey: Powyższe opcje kompilatora do kodu strip są wewnętrzne dla źródła Java kompilatora zamykania, a mianowicie CompilerOptions.java. Jednak plovr ułatwia korzystanie z stripNameSuffixes i stripTypePrefixes bez pisania kodu Java. Obecnie piszę zestaw zadań Ant dla wszystkich narzędzi zamknięcia, które zapewnią dodatkową elastyczność. Mam nadzieję, że będą gotowe do wydania przed końcem kwietnia 2012 roku. –