2012-05-25 15 views
6

Actualmente estoy trabajando en una aplicación web de aproximadamente 15 años.Limpieza de la enorme base de datos de Perl

Contiene principalmente CGI perl scripts con HTML :: Plantilla plantillas.

Tiene más de 12 000 archivos y aproximadamente 260 MB de código total. Estimo que no se necesitan más de 1500 scripts Perl y quiero deshacerme de todo el código no utilizado.

Prácticamente no hay pruebas escritas para el código.

Mis preguntas son:

  • ¿Sabe usted de cualquier módulo CPAN que puede ayudar a conseguir una lista de sólo los módulos use D y require d?
  • ¿Cuál sería su enfoque si quisiera deshacerse de todo el código adicional?

Estaba pensando en los siguientes enfoques:

  • intento de anular las use y require órdenes internas Perl con los que la salida del nombre del archivo cargado en una ubicación específica
  • anulación del warnings y/o strict módulos import función y salida el nombre del archivo en la ubicación específica
  • estudiar el módulo perl Devel::Cover y tomar el mismo enfoque y analizar la c oda al hacer la prueba manual en lugar de pruebas automatizadas
  • reemplazar el ejecutable Perl con uno personalizado, que registrará cada nombre de archivo se lee (no sé cómo hacer eso aún)
  • algún uso creativo de lsof (?!?)
+0

Mi enfoque sería comenzar con la escritura de las pruebas antes de tocar cualquier código, como siempre cuando se realiza un mantenimiento importante. –

+0

Mis estimaciones son que el 80% del código no se usa/necesita - no es financieramente factible escribir pruebas para todo el código. –

+1

@TudorConstantin: no escriba pruebas unitarias para el CÓDIGO. Escribir pruebas funcionales para casos de uso de la aplicación. – DVK

Respuesta

5

Devel::Modlist puede darle lo que necesita, pero nunca lo he usado.

Las pocas veces que he necesitado hacer algo así he optado por el enfoque de fuerza más bruta al inspeccionar %INC al final del programa.

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

Dulce. Convierta $ log_fh en una función de $ 0 y permita que las cosas se ejecuten durante un tiempo ... – gsiems

+0

hay más de una forma de hacerlo: sus dos formas parecen ser las correctas para mi necesidad. En este momento estoy trabajando en el enfoque 'END {...}' y funciona sin problemas - muchas gracias –

2

en una primera aproximación, simplemente me gustaría correr

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

a continuación, pasar un par de días la limpieza de la salida de eso. Eso le dará una lista de todos los módulos utilizados o requeridos.

Es posible que también pueda jugar con @INC para excluir ciertas rutas de biblioteca.

Si está intentando determinar la ruta de ejecución, puede ejecutar el código a través del depurador con 'rastreo' (es decir, 't' en el depurador) activado, luego redireccionar la salida a un archivo de texto para análisis mas extenso. Sé que esto es difícil cuando se ejecuta CGI ...

+0

esto generará todos los módulos en la base de código como utilizados/necesarios , porque hay versiones anteriores de la aplicación que se han reescrito (copiar/pegar y luego reescribir). Conozco algunos puntos de entrada para la aplicación, tal vez si construyo un gráfico para esas dependencias y extraigo todos los archivos que están relacionados con los puntos de entrada ..... –

+0

Ahh. Entonces, ¿tiene 12000 archivos fuente, pero no sabe cuáles se están ejecutando o no? –

+0

Debería poder determinar sus puntos de entrada desde los registros de su servidor web. Luego, podría considerar escribir una araña corta para leer cada archivo en la lista, y buscar el uso y las declaraciones requeridas. Registre cada archivo recientemente descubierto en algún marcador o gráfico, y colóquelo en la lista, y continúe hasta que la lista esté vacía. –

2

Suponiendo que las marcas de tiempo correspondientes están activados, se puede comprobar los tiempos de acceso a los distintos archivos de guión - que debe descartar cualquier archivos de comandos de nivel superior que no están siendo utilizados.

Puede valer la pena agregar algunos instrumentos a CGI.pm para registrar el nombre del script actual ($ 0) para ver qué está sucediendo.

+0

gracias por su respuesta - vale la pena investigar - especialmente para recursos no perl como imágenes –

Cuestiones relacionadas