Как найти зависимости модуля моего Perl-скрипта?

Я хочу, чтобы другой разработчик запустил написанный на 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 , но он кажется слишком сложным для того, что я хочу.)


Обновление: Спасибо, Манни, это будет делать. Я не знал о %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

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

11.12.2008 10:19:53
5 ОТВЕТОВ
РЕШЕНИЕ

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

20
29.06.2012 10:14:22

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

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

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

  1. Perl Makefile.PL
  2. делать
  3. сделать расстаться

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

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

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

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

26
11.12.2008 15:19:55
Нет, сканирование статического источника не всегда приводит к ошибкам при включении слишком большого числа зависимостей. Он также может пропустить такие вещи, как eval "require $module", где $moduleвычисляется во время выполнения на основе некоторых критериев.
cjm 8.01.2016 17:58:33

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

Штеффен уже упомянул Module :: ScanDeps.

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

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

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

Sub Foo
    {
    требовать бар; # не загружайте, пока нам не понадобится
    ....
    }

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

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

13
12.12.2008 15:12:29

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

2
23.05.2017 12:00:17

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

6
1.09.2017 14:20:35
Это подходит моей работе намного лучше, чем scandeps. Это дает мне только имена, которые я намеренно включил. (Взаимозависимости в основном не представляют интереса, поскольку современные установщики справляются с ними за вас.)
Boris Däppen 1.09.2017 13:42:51