2

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

$ sudo yum install -y perl-Archive-Tar.x86_64

但我希望我的程序检查此模块的可用性,如果它不在服务器上,请安装它并使用它

4

4 回答 4

1

yum也不是在每台服务器上都可用,因此即使您发现该模块不存在,您也可能无法安装它。

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

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

于 2013-11-13T11:15:52.340 回答
0

lib::xi(除其他外)完全符合您的要求。

它会从 CPAN 中提取缺失的模块(通过cpanm)。然而,它非常容易根据您的需要进行破解,只需几行清晰的行长(然后您甚至可以将其嵌入到您的程序中)。

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

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

话虽如此,使用App::FatPackerPAR其他人已经建议,或使用staticperl(作为 PAR,它还允许您将二进制可执行文件添加到包中),如果我正确理解您的约束,可能是最好的做法。

于 2013-11-13T23:36:52.263 回答
0

请参阅模块::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";
于 2013-11-13T13:48:51.550 回答
0

您总是可以尝试App::FatPacker,它将在您的脚本中包含您的依赖项以进行分发。

于 2013-11-13T14:08:53.340 回答