Как найти зависимости модуля моего Perl-скрипта? - PullRequest
27 голосов
/ 11 декабря 2008

Я хочу, чтобы другой разработчик запустил написанный на Perl скрипт. Сценарий использует множество модулей CPAN, которые должны быть установлены до запуска сценария. Можно ли сделать скрипт (или двоичный файл perl) для вывода списка всех отсутствующих модулей? Perl распечатывает имена отсутствующих модулей, когда я пытаюсь запустить скрипт, но это многословно и не перечисляет все отсутствующие модули одновременно. Я хотел бы сделать что-то вроде:

$ cpan -i `said-script --list-deps`

Или даже:

$ list-deps said-script > required-modules # on my machine
$ cpan -i `cat required-modules` # on his machine

Есть ли простой способ сделать это? Это не остановка шоу, но я бы хотел облегчить жизнь другим разработчикам. (Необходимые модули разбросаны по нескольким файлам, поэтому мне нелегко составить список вручную, ничего не упуская. Я знаю о PAR , но он кажется слишком сложным для того, что я хочу. ) * +1010 * <Ч />

Обновление: Спасибо, Манни, что подойдет. Я не знал о %INC, я знал только о @INC. Я согласился с чем-то вроде этого:

print join("\n", map { s|/|::|g; s|\.pm$||; $_ } keys %INC);

Который распечатывает:

Moose::Meta::TypeConstraint::Registry
Moose::Meta::Role::Application::ToClass
Class::C3
List::Util
Imager::Color
…

Похоже, это будет работать.

Ответы [ 5 ]

24 голосов
/ 11 декабря 2008

Проверьте Module :: ScanDeps и утилиту «scandeps.pl», которая поставляется с ним. Он может выполнять статический (и рекурсивный) анализ вашего кода на предмет зависимостей, а также дампа% INC после компиляции или запуска программы.

Обратите внимание, что статическое сканирование источника всегда приводит к ошибкам, включающим слишком много зависимостей. (Это сканер зависимостей, используемый PAR, и он предназначен для простоты работы с конечным пользователем.)

Наконец, вы можете распространять свой скрипт как дистрибутив CPAN. Это звучит намного сложнее, чем есть на самом деле. Вы можете использовать что-то вроде Module :: Starter , чтобы настроить базовый скелет предварительного распространения App :: YourScript. Поместите ваш скрипт в подкаталог bin / и отредактируйте Makefile.PL, чтобы он ссылался на все ваши прямые зависимости. Затем для распространения вы делаете:

  1. perl Makefile.PL
  2. сделать
  3. make dist

Последний шаг генерирует красивый App-YourScript-VERSION.tar.gz Теперь, когда клиент хочет установить все зависимости, он делает следующее:

  1. Настройте клиент CPAN правильно. Просто запустите его и ответьте на вопросы. Но ты все равно этого требует.
  2. "tar -xz App-YourScript-VERSION.tar.gz && cd App-YourScript-VERSION"
  3. Запустите "cpan."

Клиент CPAN теперь автоматически установит все прямые зависимости и зависимости этих дистрибутивов. В зависимости от того, как вы его настроите, он будет либо автоматически выполнять рекурсивные требования, либо каждый раз запрашивать y / n.

В качестве примера вы можете проверить несколько дистрибутивов App :: * на CPAN. Я думаю, что App :: Ack - хороший пример. Возможно, один из дистрибутивов App :: * из моего каталога CPAN (SMUELLER).

20 голосов
/ 11 декабря 2008

Вы можете сбросить %INC в конце вашего скрипта. Он будет содержать все используемые и обязательные модули. Но, конечно, это будет полезно только в том случае, если вам не нужны модули условно (требуется Foo, если $ bar).

13 голосов
/ 11 декабря 2008

Для быстрого и грязного, нечастого использования лучше всего выбрать %INC. Если вам нужно сделать это с помощью непрерывного интеграционного тестирования или чего-то более надежного, вам помогут другие инструменты.

Штеффен уже упомянул Модуль :: ScanDeps.

Код в Test :: Prereq делает это, но имеет дополнительный слой, который гарантирует, что ваш Makefile.PL или Build.PL перечислит их как зависимости. Если вы сделаете ваши скрипты похожими на обычный дистрибутив Perl , это позволит довольно легко проверять наличие новых зависимостей; просто запустите тестовый набор снова.

Кроме этого, вы можете использовать такой инструмент, как Module :: Extract :: Use , который анализирует статический код в поисках использования и требует операторов (хотя он не найдет их в evals-кодах строк). ). Это дает вам только модули, которые вы сказали, чтобы ваш скрипт загружал. Кроме того, когда вы знаете, какие модули вы загрузили, вы можете объединить это с инструментом CPANdeps Дэвида Кантрелла, который уже создал дерево зависимостей для большинства модулей CPAN.

Обратите внимание, что вам также нужно подумать о дополнительных функциях. Ваш код в этом случае может не иметь их, но иногда вы не загружаете модуль, пока он вам не нужен:

sub foo
    {
    require Bar; # don't load until we need to use it
    ....
    }

Если вы не задействуете эту функцию в пробном запуске или тестировании, вы не увидите, что вам нужна Bar для этой функции. Аналогичная проблема возникает, когда модуль загружает другой набор модулей зависимостей в другой среде (например, mod_perl или Windows и т. Д.).

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

6 голосов
/ 05 мая 2011

Другим инструментом в этой области, который используется Dist :: Zilla и его плагином AutoPreres, является Perl :: PrereqScanner . Он устанавливает scan-perl-prereqs программу, которая будет использовать PPI и несколько плагинов для поиска большинства типов объявлений prereq, используя минимальные версии, которые вы определили. В общем, я предлагаю это при сканировании %INC, что может привести к фиктивным требованиям и игнорировать версии.

2 голосов
/ 16 мая 2010

Сегодня я разрабатываю свои приложения на Perl как CPAN-подобные дистрибутивы с использованием Dist :: Zilla , которые могут заботиться о зависимостях через плагин AutoPrereq . Еще один интересный фрагмент кода в этой области - картон .

...