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

Выступив добровольцем для поддержки застойного пакета CPAN (GnuPG), я хотел бы улучшить установочные файлы так, чтобы они корректно выходили, если gpg двоичный файл (для которого GnuPG является оболочкой) не найден. После небольшого поиска вдохновения от других пакетов, я придумал добавить это в Makefile.PL:

my @paths = grep { -x "$_/gpg" } split /:/, $ENV{PATH}, $ENV{PGP_PATH};

unless ( scalar @paths ) {
    print <<EOD;
I can't find the gpg binary on your system. If it's not installed in your usual PATH, set $ENV{PGP_PATH} to include where it can be found and try installing again.
EOD

    exit(0);
}

WriteMakefile(
    'NAME'        => 'GnuPG',
    'VERSION_FROM' => 'GnuPG.pm',
    'EXE_FILES'    => [ gpgmailtunl ],
    'LICENSE'      => 'GPL',
    'LIBS'         => [ @paths ],
);

Это выглядит вменяемым?

5 ответов

Решение

Общая концепция в порядке - если то, что вам нужно для работы, отсутствует, не создавайте make-файл. У тестеров CPAN есть правила выхода из игры с нулевым статусом при сбое (что меня сильно раздражает, но не берите в голову; я терпеть не могу терпеть неудачу со статусом успеха!).

Вопрос: ведете ли вы запись о том, где был обнаружен PGP во время установки, чтобы, если кто-то еще использовал модуль Perl без местоположения на своем пути, модуль все еще мог работать?

Для DBD::Informix у меня есть жесткие зависимости, без которых модуль не может быть скомпилирован; Из-за этого Makefile.PL является основным производством. Он также пытается работать с версиями программного обеспечения, охватывающими более 15 лет; это тоже усложняет его жизнь. Если предварительные требования (некоторые модули Perl; некоторые не-Perl программное обеспечение) недоступны, он не будет установлен.

Если вы используете Module::Install или часть этого семейства, вы можете использовать do

requires_external_bin 'gpg';

Смотрите http://p3rl.org/Module::Install::External для подробностей.

Нет веских причин изобретать велосипед.

Для большей точности вы должны посмотреть File::Which или хотя бы использовать File::Spec->path().

Не будет ли больше смысла просто напечатать предупреждение? Нужен ли gpg для самой установки?

Сам код выглядит хорошо для меня. Но, возможно, есть встроенная функциональность "который".:).

Файл:: Который был бы кроссплатформенным решением. Вам нужно будет либо связать его в каталог inc/, либо потребовать его установки с помощью configure_requires. Для EU::MM это можно сделать с помощью

    META_MERGE => {
        configure_requires => {
            'File::Which' => 0,

Module::Install также является хорошим решением, но вам нужно будет выпускать новую версию дистрибутива каждый раз, когда выпускается новая версия Module::Install, и изменения важны.

Другие вопросы по тегам