Как я могу проверить, доступна ли бинарная зависимость в 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, и изменения важны.