2012-05-25 14 views
6

Attualmente sto lavorando a un'applicazione web di circa 15 anni.Cleanup enorme Perl Codebase

Esso contiene principalmente CGI script Perl con HTML :: Template modelli.

Ha oltre 12 000 file e circa 260 MB di codice totale. Stimo che non servono più di 1500 script perl e voglio liberarmi di tutto il codice inutilizzato.

Non ci sono praticamente prove scritte per il codice.

Le mie domande sono:

  • Sei a conoscenza di qualsiasi modulo CPAN che può aiutarmi a ottenere un elenco di soli use d e require d moduli?
  • Quale sarebbe il tuo approccio se volessi sbarazzarti di tutto il codice extra?

Stavo pensando ai seguenti approcci:

  • cercare di ignorare le builtins use e require perl con quelli che in uscita il nome del file caricato in una posizione specifica
  • di override del warnings e/o strict moduli import e il nome del file nella posizione specifica
  • studiare il modulo perl Devel::Cover e adottare lo stesso approccio e analizzare il c ode quando fare test manuale invece di test automatizzati
  • sostituire l'eseguibile perl con uno personalizzato, che sarà registrare ogni nome di file si legge (non so come si fa ancora)
  • un certo uso creativo della lsof (?!?)
+0

Il mio approccio sarebbe quello di iniziare con la scrittura dei test prima di toccare qualsiasi codice, come sempre quando si fa maggiore manutenzione. –

+0

mie stime sono che l'80% del codice non viene utilizzato/bisogno - non è finanziariamente fattibile per scrivere test per l'intero codice. –

+1

@TudorConstantin: non scrivere test unitari per il CODICE. Scrivi test funzionali per casi d'uso dell'app. – DVK

risposta

5

Devel::Modlist potrebbe darti quello che ti serve, ma non l'ho mai usato.

Le poche volte che ho avuto bisogno di fare qualcosa di simile, ho optato per l'approccio più brutale dell'ispezione di %INC alla fine del programma.

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

Dolce. Rendi $ log_fh una funzione di $ 0 e lascia che le cose vadano per un po '... – gsiems

+0

c'è più di un modo per farlo - i tuoi due modi sembrano giusti per il mio bisogno. In questo momento sto lavorando sull'approccio 'END {...}' e funziona senza intoppi - grazie mille –

2

in prima approssimazione, vorrei semplicemente correre

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

Poi trascorrere un paio di giorni ripulire l'uscita da questo. Questo ti darà una lista di tutti i moduli usati o richiesti.

Potresti anche essere in grado di giocare con @INC per escludere determinati percorsi di libreria.

Se si sta tentando di determinare il percorso di esecuzione, è possibile eseguire il codice tramite il debugger con 'trace' (cioè 't' nel debugger) attivato, quindi reindirizzare l'output in un file di testo per ulteriori analisi. So che questo è difficile quando si esegue CGI ...

+0

questa uscita volontà tutti i moduli del codice di base come in uso/bisogno , perché ci sono versioni precedenti dell'applicazione che sono state riscritte (copia/incolla e poi riscrive). So che alcuni punti di ingresso per l'applicazione, forse se io costruisco un grafico per quelle dipendenze e estrarre tutti i file che sono legati ai punti di entrata ..... –

+0

Ahh. Quindi hai 12000 file sorgente, ma non sai quali sono o non vengono eseguiti? –

+0

Si dovrebbe essere in grado di determinare i punti di ingresso da log del server web. Potresti quindi prendere in considerazione la scrittura di un breve ragno per leggere ciascun file nell'elenco e cercare l'uso e richiedere istruzioni. Registra ogni file appena scoperto in un tabellone segnapunti o grafico, e mettilo nell'elenco, e continua fino a quando l'elenco non è vuoto. –

2

Supponendo che i timestamp rilevanti sono accesi, si potrebbe verificare i tempi di accesso ai vari file di script - che dovrebbe escludere qualsiasi file di script di livello superiore che non vengono utilizzati.

potrebbe essere la pena di aggiungere un po 'di strumentazione per CGI.pm per accedere allo script-nome attuale ($ 0) per vedere cosa sta succedendo.

+0

grazie per la tua risposta - vale la pena indagare - specialmente per risorse non perl come immagini –