2009-05-10 3 views
2

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

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 ], 
); 

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

+1

Вы никогда не должны делиться на ":", а скорее на $ Config {path_sep}. Или, для этой цели, используйте что-то вроде IPC :: Cmd :: can_run ('gpg') – xdg

ответ

1

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

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

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

+0

Запись не записывается. Я не слишком много разбираюсь в рефакторинге, учитывая, что я не готов тратить на него слишком много времени, поэтому вряд ли это сохранится в ближайшем будущем. GnuPG не может работать без двоичного файла gpg, поэтому, хотя он и может быть установлен без него, без него это было бы бесполезно. – robbiebow

1

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

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

+0

Это правда. Мне нужно будет пропустить тесты, если gpg не будет найден. – robbiebow

1

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

3

Если вы используете модуль :: Установить или часть этой семьи, вы можете использовать сделать

requires_external_bin 'gpg'; 

См Module::Install::External подробности.

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

+0

Спасибо. Он основан на ExtUtils :: MakeMaker atm, но это может измениться. – robbiebow

+2

И если вам нужно проверить, доступны ли определенные библиотеки и файлы заголовков (а не только двоичные файлы), вы можете использовать Devel :: CheckLib. – mpeters

1

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

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

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