如何在Perl程序中动态地将程序的库路径添加到@INC?

时间:2014-06-15 21:39:24

标签: perl

我正在研究用Perl编写的应用程序。现在应用程序太大了,我想将每个类移到一个单独的文件中。这个复杂的建筑和安装程序;当它只是文件时,可以很容易地在任何地方复制到位。现在我必须使用像Build::ModuleExtUtils::MakeMaker这样的构建系统。

我已经构建了我的源代码树,因此我有两个目录:程序启动器所在的bin和许多模块所在的libBin包含用户调用的可执行Perl脚本,并从lib目录加载必要的模块。

我遇到的问题是我希望用户能够指定他们希望安装程序的前缀,类似于基于GNU Autotools的软件包提供的--prefix选项。由于这可能不是Perl查找模块的标准路径(例如/ opt / program),因此用户会看到类似Can't locate Program.pm in @INC的消息。

有没有办法让程序检测到应该加载模块的位置,并动态地将该路径添加到@INC?我不希望用户必须手动处理PERL5LIB等环境变量才能使程序运行。

3 个答案:

答案 0 :(得分:3)

您无法使用findbinlib吗?:

use FindBin qw($Bin);
use lib "$Bin/lib";

答案 1 :(得分:2)

如果我了解你,你就会将一个大型程序分解成更小的组件。对你有益!这是很棒的编程技巧。让每个类成为真正的Perl模块是一个好主意。它使您的程序更容易维护。

我一直这样做。首先,我使用模块名Local::作为我的前缀。 CPAN永远不会使用Local作为模块前缀,因此我知道我永远不会与某些CPAN模块发生冲突。然后,我将Local模块目录放在与我的脚本相同的目录中。在大多数标准Perl安装中,当Perl在@INC搜索模块时,它搜索的最后一个目录是当前目录(.)。由于我的模块名称永远不会与任何CPAN模块冲突,我知道Perl会在./Local目录下找到我的模块和模块。

您现在可以将整个目录结构分发给其他用户。用户所要做的就是安装整个目录(包括脚本和模块)并运行脚本。无需完成整个安装过程。

答案 2 :(得分:0)

以下代码适用于我。您提供了一个命令行选项,如(--prefix abc),并且该值会在脚本的早期附加到lib路径。因此,将使用动态设置的路径搜索所有后续模块。

use strict;
use warnings;
use Getopt::Long;

my $prefix = '';

BEGIN {
  GetOptions ('prefix=s' => \$prefix );
  $prefix = $prefix || '.';
}

use lib "$prefix";
use mymod; # uses the dynamical search path