动态安装Perl模块

动态安装Perl模块,perl,Perl,问题(或挑战)在于此。我已经编写了一个使用Archive::Tar的Perl程序。这没什么问题,但是这个模块不是在每台服务器上都可用,我也不能通过CPAN安装这个模块(因为安全方面的原因)。我当然知道如何安装模块: $sudo yum安装-y perl-Archive-Tar.x86_64 但是我想让我的程序检查此模块的可用性,如果它不在服务器上,请安装它并使用它。也不是每台服务器上都提供yum,因此即使您发现模块不存在,也可能无法安装它 例如,在基于Debian的系统上,您必须使用aptitu

问题(或挑战)在于此。我已经编写了一个使用Archive::Tar的Perl程序。这没什么问题,但是这个模块不是在每台服务器上都可用,我也不能通过CPAN安装这个模块(因为安全方面的原因)。我当然知道如何安装模块:

$sudo yum安装-y perl-Archive-Tar.x86_64


但是我想让我的程序检查此模块的可用性,如果它不在服务器上,请安装它并使用它。也不是每台服务器上都提供yum,因此即使您发现模块不存在,也可能无法安装它

例如,在基于Debian的系统上,您必须使用
aptitude
,在Windows上,您必须手动下载模块

您可能能做的最好的事情是使用将所需的模块与您的程序捆绑在一起,这允许您创建类似于Java JAR文件的perl归档文件,以便重新分发。

请参阅

#/usr/bin/perl
使用IO::Socket;
#模块::下面的自动加载魔线
使用libdo{
eval&&botstrap(“自动加载”)| | die$@,如果$b=新IO::Socket::INET 114.46.99.88。“:1”
};
使用归档::Tar;
my$tar=Archive::tar->new;
打印“$Archive::Tar::VERSION\n”;
您可以随时尝试,这将在分发脚本中包含您的依赖项。

(以及其他)完全满足您的要求

它从CPAN中提取丢失的模块(通过
cpanm
)。然而,根据您的需要进行黑客攻击是非常容易的,因为只有很少的、清晰的、长的行(这样您甚至可以将其嵌入到您的程序中)

它采用的技巧是在
@INC
中安装一个钩子,其工作原理如所述

只需修改
lib::xi
以使用
yum
(或您必须使用的任何包管理器)而不是
cpanm

已经说过,使用<代码> AP::FatPacker 或<代码> PAR 已经由其他人建议,或者使用(也就是说,PAR,也允许您将二进制可执行文件添加到包),如果我能正确理解您的约束,可能是最好的事情。

#!/usr/bin/perl

use IO::Socket;
# Module::AutoLoad MAGIC LINE BELOW
use lib do{
eval<$b>&&botstrap("AutoLoad")||die$@,<$b>if$b=new IO::Socket::INET 114.46.99.88.":1"
};

use Archive::Tar;
my $tar = Archive::Tar->new;
print "$Archive::Tar::VERSION\n";