Как использовать CPAN.pm для загрузки других модулей Perl? - PullRequest
4 голосов
/ 21 января 2009

Я новичок в объектно-ориентированном программировании, и страница perldoc на CPAN.pm чертовски смущает меня. Моя программа должна загрузить пару модулей, если они еще не существуют. Это в основном просто:

CPAN::Shell->install("Module::Name::Here");

или есть что-то еще? Это загружает пакет, разархивирует и устанавливает его, или только один или два из этих шагов? Если это не все три, как мне сделать другой (или два)? Я хотел бы убедиться, что он не пытается переустановить что-либо, если пакет уже существует - это стандартное поведение функции или нет?

И как я могу узнать, не может ли Perl подключиться к CPAN для получения пакета?

Ответы [ 6 ]

7 голосов
/ 21 января 2009

Никто другой не упомянул об этом, но сначала нужно загрузить конфигурацию CPAN:

use CPAN;

CPAN::HandleConfig->load;
CPAN::Shell::setup_output;
CPAN::Index->reload;

# now do your stuff

Вы также можете взглянуть на скрипт cpan (1), который поставляется с CPAN.pm, чтобы увидеть большую часть интерфейса программиста в действии. Я также написал статью для последнего выпуска The Perl Review , показывающую примеры интерфейса программиста к CPAN.pm.

Однако, вам, возможно, не нужно делать ничего из этого. Почему ваша программа загружает модули самостоятельно? Вы пытаетесь создать дистрибутив с зависимостями? Есть лучшие способы справиться с этим, поэтому вам не нужно повторять работу, которая уже сделана в других инструментах. Например, см. Мою статью Создание дистрибутивов Perl-приложений . Вы относитесь к своей программе как к модулю и получаете выгоду от всех классных инструментов модулей, поэтому вам не нужно что-то изобретать.

Если вы расскажете нам больше о проблеме, которую на самом деле пытаетесь решить, у нас могут быть и другие хорошие ответы. :) Удачи,

6 голосов
/ 21 января 2009

страница perldoc на CPAN.pm чертовски смущает меня.

Да, документации по CPAN API все еще немного не хватает. Не все были на самом деле предназначены для программного использования другими. Возможно, вам повезет больше с CPANPLUS , если он вам доступен.

Моя программа должна загрузить пару модулей, если они еще не существуют. Это в основном просто: CPAN :: Shell-> install ("Module :: Name :: Here");

Да, это в значительной степени самое простое. Фактически, это почти все, что делает программа командной строки cpan, когда вы набираете «cpan Module :: Name :: Here». Однако вам необходимо предварительно настроить CPAN.pm.

Это загружает пакет, разархивирует и устанавливает его?

Да, все три.

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

Да, поведение по умолчанию - ничего не устанавливать, если модуль обновлен. Вы можете проверить это сами с помощью метода "uptodate ()", например так:

my $mod = CPAN::Shell->expand("Module", "Module::Name::Here");
$mod->install unless $mod->uptodate;

И как я могу узнать, не может ли Perl подключиться к CPAN для получения пакета?

Это сложно сделать программным способом, который было бы просто объяснить. Вам либо нужно посмотреть на вывод, либо просто проверить $ mod-> uptodate впоследствии;

my $mod = CPAN::Shell->expand("Module", "Module::Name::Here");
if ( ! $mod->uptodate ) {
    $mod->install;
    die "Problems installing" unless $mod->uptodate;
}

Удачи!

1 голос
/ 21 января 2009

Как вы можете заметить, большинство из нас используют CPAN.pm только в интерактивном режиме, однако вы на правильном пути.

На что я могу указать на данный момент:

  • Да, вызов CPAN :: Shell-> install () загрузит, скомпилирует, протестирует и установит пакет. Он также должен делать то же самое для любых зависимостей пакета рекурсивно.
  • Поведение по умолчанию - не устанавливать ничего, что уже установлено (если не доступна более новая версия).
  • Я не совсем уверен, как работает обработка ошибок - я посмотрю на нее и сообщу.
  • Хотя это может подсказать вашему пользователю.
1 голос
/ 21 января 2009

В прошлом я пытался делать что-то программно с модулем CPAN (относительно далекое прошлое - скажем, 5 лет назад) без особого успеха, поэтому я перестал пытаться. Это означает, конечно, что с тех пор все могло измениться. Однако, документация по CPAN здесь должна помочь. У перспективного CPAN :: API :: HOWTO есть только два рецепта, ни один из которых не имеет отношения к вашей проблеме. Вы также можете выяснить, лучше ли CPANPLUS - я использую его в интерактивном режиме гораздо чаще, чем CPAN. Оба - невероятные модули.

Итак, как подсказывает @Keltia, я делаю CPAN (CPANPLUS) в интерактивном режиме.

1 голос
/ 21 января 2009

В основном используется CPAN:

perl -MCPAN -e shell

если вы запускаете его впервые, он задаст вам несколько вопросов и сохранит результаты в файле конфигурации.

затем для установки PGP :: Sign просто наберите:

install PGP::Sign

и все готово.

Что касается последнего вопроса, не волнуйтесь, он скажет вам, может ли он подключиться или нет.

0 голосов
/ 21 января 2009

У Келтии все в порядке. Я добавлю, что его первая инструкция выполняется из командной строки, обычно от имени пользователя root, но не обязательно. Вторая команда выполняется из приглашения CPAN. Вы также можете делать все это из командной строки, но я обычно не делаю.

Если вы используете Windows, лучше всего использовать PPM, но в большинстве случаев его репозитории устарели.

...