2012-05-25 5 views
6

В настоящее время я работаю над 15-летним веб-приложением.Очистка огромного Perl Codebase

Он содержит в основном CGI перл скрипты с HTML :: Template шаблоны.

Имеет более 12 000 файлов и примерно 260 МБ общего кода. Я считаю, что не более 1500 perl-скриптов необходимы, и я хочу избавиться от всего неиспользуемого кода.

Для кода не существует тестов.

Мои вопросы:

  • Вы в курсе любого модуля CPAN, который может помочь мне получить список только use d- и require д модулей?
  • Каким будет ваш подход, если вы хотите избавиться от всего лишнего кода?

Я думал, на следующих подходах:

  • попытаться переопределить use и require перл встроенных команд с тех, что выход загруженного имени файла в определенном месте
  • переопределять значение warnings и/или strict модули import функции и вывести имя файла в определенном месте
  • изучить модуль perl модуля Devel::Cover и использовать тот же подход и проанализировать c ода, делая ручное тестирование вместо автоматических тестов
  • заменить PERL исполняемый файл с пользовательской один, который будет регистрировать каждое имя файла он читает (я не знаю, как сделать это еще)
  • некоторое творческое использование lsof (?!?)
+0

Мой подход заключается в том, чтобы начать писать тесты перед тем, как прикоснуться к любому коду, как всегда, когда выполняете основное обслуживание. –

+0

Мои оценки заключаются в том, что 80% кода не используется/не требуется - в финансовом плане невозможно написать тесты для всего кода. –

+1

@TudorConstantin - не записывайте модульные тесты для КОДА. Напишите функциональные тесты для использования приложений. – DVK

ответ

5

Devel::Modlist может дать вам то, что вам нужно, но я никогда не использовал его.

Несколько раз, когда мне нужно было сделать что-то вроде этого, я выбрал более грубый подход к проверке %INC в конце программы.

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

Сладкий. Сделайте $ log_fh функцией $ 0, и пусть все будет работать немного ... – gsiems

+0

есть несколько способов сделать это - ваши оба пути кажутся мне подходящими. Сейчас я работаю над подходом 'END {...}', и он работает плавно - большое спасибо –

2

в первом приближении, я бы просто запустить

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

Затем провести пару дней очистки на выходе из этого. Это даст вам список всех используемых или необходимых модулей.

Вы также можете сыграть с @INC, чтобы исключить определенные пути к библиотеке.

Если вы пытаетесь определить путь выполнения, вы можете запустить код через отладчик с включенным «trace» (т.е. «t» в отладчике), а затем перенаправить вывод в текстовый файл для дальнейший анализ. Я знаю, что это сложно при работе CGI ...

+0

, это будет выводить все модули в кодовой базе как используемые/необходимые , потому что есть более старые версии приложения, которые были переписаны (скопируйте/вставьте, затем перепишите). Я знаю некоторые точки входа для приложения, возможно, если я построю график для этих зависимостей и извлеките все файлы, связанные с точками входа ..... –

+0

Ahh. Итак, у вас есть 12000 исходных файлов, но вы не знаете, какие из них или не выполняются? –

+0

Вы должны иметь возможность определять свои точки входа из журналов веб-сервера. Затем вы можете подумать о написании короткого паука, чтобы прочитать каждый файл в списке и найти инструкции по использованию и требованию. Запишите каждый вновь обнаруженный файл на какой-либо табло или графике, а затем поместите его в список и продолжайте, пока список не будет пуст. –

2

Предполагая, что соответствующие временные метки включены, вы можете проверить время доступа различных файлов сценариев - это должно исключить любые файлы сценариев верхнего уровня, которые не используются.

Возможно, стоит добавить некоторые инструменты для CGI.pm для регистрации текущего имени скрипта ($ 0), чтобы узнать, что происходит.

+0

благодарю вас за ваш ответ - стоит исследовать - особенно для ресурсов non perl, таких как изображения –

Смежные вопросы