2

在自愿维护一个停滞的 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 ],
);

这看起来很正常吗?

4

5 回答 5

3

如果您使用的是 Module::Install 或该系列的一部分,则可以使用 do

requires_external_bin 'gpg';

有关详细信息,请参阅模块::安装::外部

没有充分的理由重新发明轮子。

于 2009-05-10T15:17:54.933 回答
1

File::这将是一个跨平台的解决方案。您需要将它捆绑到 inc/ 目录中,或者要求使用 configure_requires 安装它。对于 EU::MM 可以使用

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

Module::Install 也是一个很好的解决方案,但是每次发布新版本的 Module::Install 并且更改很重要时,您都需要发布新版本的发行版。

于 2009-05-10T19:29:30.720 回答
1

为了获得更好的准确性,您应该查看File::Which或至少使用 File::Spec->path()。

于 2009-05-10T15:01:26.680 回答
1

一般概念很好 - 如果您需要工作的内容不存在,请不要创建 makefile。CPAN 测试人员有关于在失败时以零状态退出的规则(这让我很恼火,但没关系;我讨厌以成功状态失败!)。

问题:您是否记录了安装时 PGP 的位置,以便如果其他人使用 Perl 模块而没有路径上的位置,该模块仍然可以运行?

对于 DBD::Informix,我有严格的依赖关系,没有它就无法编译模块;因此,Makefile.PL 本身就是一个主要的产品。它还尝试处理超过 15 年的软件版本;这也使它的生活复杂化。如果先决条件(一些 Perl 模块;一些非 Perl 软件)不可用,则不会安装。

于 2009-05-10T15:31:44.407 回答
1

打印警告不是更有意义吗?安装本身是否需要 gpg?

代码本身对我来说看起来不错。但也许有一个内置的“哪个”功能。:)。

于 2009-05-10T14:29:42.833 回答