Как найти все модули, используемые скриптом Perl? - PullRequest
16 голосов
/ 19 января 2011

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

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

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

Ответы [ 4 ]

14 голосов
/ 19 января 2011

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

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

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

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

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

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

5 голосов
/ 19 января 2011

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

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

2 голосов
/ 19 января 2011

Вы можете посмотреть на% INC, см. http://www.perlmonks.org/?node_id=681911, в котором также упоминается Devel :: Modlist

0 голосов
/ 07 января 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...