问题(或挑战)是这样的。我编写了一个使用 Archive::Tar 的 Perl 程序。没有错,但这个模块并不是在每台服务器上都可用,我也不能通过 CPAN 安装模块(因为安全方面)。我当然知道如何安装模块:
$ sudo yum install -y perl-Archive-Tar.x86_64
但我希望我的程序检查此模块的可用性,如果它不在服务器上,请安装它并使用它
问题(或挑战)是这样的。我编写了一个使用 Archive::Tar 的 Perl 程序。没有错,但这个模块并不是在每台服务器上都可用,我也不能通过 CPAN 安装模块(因为安全方面)。我当然知道如何安装模块:
$ sudo yum install -y perl-Archive-Tar.x86_64
但我希望我的程序检查此模块的可用性,如果它不在服务器上,请安装它并使用它
yum
也不是在每台服务器上都可用,因此即使您发现该模块不存在,您也可能无法安装它。
例如,在基于 Debian 的系统上您必须使用aptitude
,在 Windows 上您必须手动下载模块。
您可能做的最好的事情是使用PAR将所需的模块与您的程序捆绑在一起,这允许您创建类似于 Java 的 JAR 文件的 perl 存档以进行重新分发。
lib::xi(除其他外)完全符合您的要求。
它会从 CPAN 中提取缺失的模块(通过cpanm
)。然而,它非常容易根据您的需要进行破解,只需几行清晰的行长(然后您甚至可以将其嵌入到您的程序中)。
它采用的技巧是安装一个钩子@INC
,它的工作原理如此处所述。
只需修改lib::xi
为使用yum
(或您必须使用的任何包管理器)而不是cpanm
.
话虽如此,使用App::FatPacker
或PAR
其他人已经建议,或使用staticperl(作为 PAR,它还允许您将二进制可执行文件添加到包中),如果我正确理解您的约束,可能是最好的做法。
请参阅模块::AutoLoad。
#!/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";
您总是可以尝试App::FatPacker,它将在您的脚本中包含您的依赖项以进行分发。