2012-05-25 16 views
6

Obecnie pracuję nad około 15-letnią aplikacją internetową.Oczyszczenie ogromnej biblioteki Perla Codebase

Zawiera głównie CGI skrypty perl z szablonami HTML :: Template.

Ma ponad 12 000 plików i około 260 MB całkowitego kodu. Szacuję, że nie potrzeba więcej niż 1500 skryptów perl i chcę pozbyć się całego nieużywanego kodu.

Dla kodu nie ma praktycznie żadnych testów.

Moje pytania są następujące:

  • Czy jesteś świadomy każdego modułu CPAN, że może mi pomóc uzyskać listę tylko modułów use D i require d?
  • Jakie byłoby Twoje podejście, gdybyś chciał pozbyć się całego dodatkowego kodu?

myślałem o następujących metod:

  • starają się zastąpić use i require perla pomocy poleceń wbudowanych z tych, które wyjście obciążony nazwa pliku w określonej lokalizacji
  • przestawianie warnings i/lub strict moduły: funkcji i wypisać nazwę pliku w określonej lokalizacji
  • zbadać moduł perl Devel::Cover i przyjąć to samo podejście i analizować c Oda podczas wykonywania testów ręcznych zamiast zautomatyzowanych testów
  • zastąpić plik wykonywalny Perla z niestandardowych jeden, który będzie logował każdą nazwę pliku czyta (nie wiem jak to zrobić jeszcze)
  • twórcze wykorzystanie lsof (?!?)
+0

Moje podejście polegałoby na rozpoczynaniu od napisania testów przed dotknięciem dowolnego kodu, tak jak zawsze przy wykonywaniu większych czynności konserwacyjnych. –

+0

Moje szacunki mówią, że 80% kodu nie jest używane/potrzebne - nie jest opłacalne pisanie testów dla całego kodu. –

+1

@TudorConstantin - nie pisz testów jednostkowych dla KODU. Napisz testy funkcjonalne dla przypadków użycia aplikacji. – DVK

Odpowiedz

5

Devel::Modlist może dać ci to, czego potrzebujesz, ale nigdy go nie użyłem.

Kilka razy musiałem zrobić coś takiego, wybrałem bardziej brutalne podejście polegające na sprawdzeniu %INC na końcu programu.

END { 
    open my $log_fh, ...; 
    print $log_fh "$_\n" for sort keys %INC; 
} 
+0

Słodki. Ustaw $ log_fh jako funkcję 0 $ i pozwól, aby wszystko działało przez chwilę ... – gsiems

+0

jest więcej niż jeden sposób, aby to zrobić - twoje obie strony wydają się być w sam raz dla mojej potrzeby. Obecnie pracuję nad podejściem "END {...}" i działa sprawnie - wielkie dzięki –

2

w pierwszym przybliżeniu, chciałbym po prostu uruchomić

egrep -r '\<(use|require)\>' /path/to/source/* 

Następnie spędzić kilka dni oczyszczania wyjście z tego. To da ci listę wszystkich modułów używanych lub wymaganych.

Możesz również być w stanie bawić się przy pomocy @INC, aby wykluczyć określone ścieżki biblioteki.

Jeśli próbujesz ustalić ścieżkę wykonania, możesz być w stanie uruchomić kod za pomocą debuggera z włączonym "śledzeniem" (tj. "T" w debugerze), a następnie przekierować dane wyjściowe do pliku tekstowego dla Dalsza analiza. Wiem, że to jest trudne, gdy działa CGI ...

+0

spowoduje to wyprowadzenie wszystkich modułów w bazie kodu jako używanych/potrzebnych , ponieważ istnieją starsze wersje aplikacji, które zostały przepisane (kopiuj/wklej, a następnie przepisuj). Znam niektóre punkty wejścia dla aplikacji, może jeśli zbuduję wykres dla tych zależności i wyodrębnię wszystkie pliki powiązane z punktami wejścia ..... –

+0

Ahh. Masz 12000 plików źródłowych, ale nie wiesz, które z nich są lub nie są wykonywane? –

+0

Powinieneś być w stanie określić swoje punkty wejścia z logów serwera WWW. Możesz wtedy rozważyć napisanie krótkiego pająka, aby przeczytać każdy plik na liście i wyszukać instrukcje użycia i wymagające. Zapisz każdy nowo odkryty plik na tablicy wyników lub wykresu, a następnie umieść go na liście i kontynuuj, dopóki lista nie będzie pusta. –

2

Zakładając odpowiednie znaczniki czasu są włączone, można sprawdzić czas dostępu na różnych skryptów - które powinny wykluczyć wszelkie pliki skryptów najwyższego poziomu, które nie są używane.

Może warto dodać trochę instrumentów do CGI.pm, aby zarejestrować bieżącą nazwę skryptu (0 USD), aby zobaczyć, co się dzieje.

+0

dziękuję za odpowiedź - warte zbadania - zwłaszcza w przypadku zasobów innych niż perl, takich jak obrazy –