Подтвердить что ты не робот

Как найти все модули, используемые Perl script?

Я готов попробовать развернуть код на нескольких машинах. Насколько я знаю, использование Makefile.pm для отслеживания зависимостей - лучший способ убедиться, что они установлены повсюду. У меня проблема: я не уверен, что наш Makefile.pm был обновлен, так как это приложение прошло через несколько разных разработчиков.

Есть ли способ автоматического анализа через мой источник или несколько полных прогонов моей программы, чтобы точно определить, какие версии модулей зависят от моего приложения? Кроме того, есть ли способ отфильтровать его на основе CPAN пакетов? (Так что я полагаюсь только на Moose вместо каждого модуля, который поставляется с Moose.)

Третий вопрос связан с тем, что, если вы зависите от версии модуля, которая не является последней, какой способ лучше всего установить ее? Должен ли я включать все локализованные установки Perl с моим приложением?

4b9b3361

Ответ 1

Просто для того, чтобы быть понятным - вы не можете получить общий список модулей, зависящих только от анализа кода. Например. если ваши приложения eval { require $module; $module->import() }, где $module передается через командную строку, тогда это ТОЛЬКО можно обнаружить, фактически выполнив конкретную версию командной строки со всеми значениями модуля.

Если вы хотите это сделать, вы можете определить каждый модуль, используемый комбинацией прогонов через:

  • Devel::Cover. В отчетах о покрытии будет указано 100% используемых модулей. Но вы не получаете версию #s.

  • Распечатайте %INC в каждую возможную точку выхода в коде, как сказал ответ slu. Вероятно, это должно быть сделано в блоке END{}, а также в обработчике __DIE__, чтобы охватить все возможные точки выхода, и даже тогда это может быть не полностью 100% покрытие в общем случае, если где-то внутри программы ваш обработчик __DIE__ перезаписывается.

  • Devel::Modlist (также упомянутый slu-ответом) - недостаток по сравнению с Devel::Cover заключается в том, что он, похоже, не может объединить базу данных в несколько прогонов прогона, например, Devel::Cover. С положительной стороны, он специально создан, поэтому имеет много очень полезных опций (пути CPAN, версии).

  • Обратите внимание, что другой модуль (Module::ScanDeps) НЕ позволяет вам выполнять анализ времени выполнения на основе произвольных аргументов командной строки (например, на первый взгляд кажется, что вы разрешаете выполнять программу без аргументы), и если это правда, уступает всем выше перечисленным 3 методам для любого кода, который может загружать модули динамически.

Ответ 2

Module::ScanDeps - Рекурсивно сканировать код Perl для зависимостей

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

Ответ 4

Я бы определенно использовал Devel:: TraceUse, который также показывает дерево модулей, поэтому легко угадать, где они загружаются.